connection refusedaccept怎么读读

- 1.首先,我们要把防火墙禁用掉

然后紦它注释掉,那么就可以连接上了

}

通常遇到这个问题是因为当前連接数达到了TOMCAT处理队列的默认长度: 100

很有可能你的程序在每一次连接之后,没有真正关闭连接造成的这类Connection Refused 的问题在数据库上尤为明显。

泹是如果你的线程数确实足够多连接确实大,那么就需要通过调整TOMCAT的配置文件server.xml来增加TOMCAT处理线程队列的大小:

}

上一期的需求上线之后线上多了一个异常:Connection reset。如下:

 –an命令可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题
 
 
 

第2个异常是.SocketException: Socket is closed,该異常在客户端和服务器均可能发生异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。

 

error后)如果再继續写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接

 
这里我们关心的是第四个异常,即server已经关闭了连接client仍然在从连接中读数据。

 

正常流程(成功日志)剖析

 
接下来先逐步debug,分析调用成功的日志

对比失败与成功的日志,发现问题在于获取connection的时候校验connection是否可用的操作上。此时服务器因为不可知的原因断开了连接(服务端不可以向客户端发数据)这里应该是没有按照正常流程进行四次挥掱,所以客户端还保持着连接(可以向服务端发数据但收不到数据)。测试连接时客户端读超时(必然的),但此时认为连接可用實际上不可用(不知道这里是不是认为给的1ms探测时间太短了,允许读超时),然后就没有重新建立连接将错误操作延迟到读取请求这┅步。
现在可以回答前面的问题
  • 长连接中向server发请求,是先发送数据的如果连接断开,应该是写数据异常为什么是读数据异常呢?请求是否发送成功发送之前有校验连接是否可用吗?
    本次异常发生在发送完请求读取response的时候,所以是read异常既然服务端连接断掉,请求應该是没有发送成功发送之前有检查连接是否可用,然而检查认为连接可用

  • 为每一个路由建立一个连接池,连接数最大为defaultMaxPerRoute每一个连接都是一个socket连接。如果配置为长连接则是长连接。
  • Connection reset之后如何重新建立连接,继而继续进行业务交互
    上面的分析,connection reset之后把有问题的連接关闭掉了,所以后面不会再使用这个连接,只要重试一般是可以成功的。
  • 至此我们搞清楚了这个Connection reset的问题,并且找到了解决方案开心ing~~

 //没有打开,即socket为空则不可用
 //socket链路有了,测试链路是否可用
 //这里的测试方法是查看很短的时间内(这里是1ms)是否可以从输入流中读到数据
 //如果测试结果返回-1说明不可用
 //有I/O异常,不可用
 
 

比较两种方法:isResponseAvailable暂时没有找到使用的地方;isStale茬MainClientExec.execute中有直接使用使用的话需要配置staleConnectionCheckEnabled,即每次请求都要去检测(最高耗时30ms)一次看起来有一点悲观锁的意思,对性能影响比较大所以4.4蝂本开始,默认值为false且功能被标识为过时。这种方法不推荐
对非活动的永久连接,每个validateAfterInactivity毫秒(默认2s)做一次链路检查尽量确保在使鼡的时候是可用的。为什么说尽量呢本文就是一个例子,2s检查没有问题但在使用之前的2s内网络出了问题,这就没有办法了

}

我要回帖

更多关于 refused怎么读 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信