java.net.SocketException: Connection reset 解决方法

转载  更新时间:2013年03月20日 14:21:57   作者:   我要评论

最近纠结致死的一个java报错java.net.SocketException: Connection reset 终于得到解决

自从SEOTcs系统11月份24日更新了一下SEO得分算法以来,一直困扰我的一个问题出现了,java的数据job任务,在执行过程中会经常报以下的错误:

“2011-12-03 18:00:32 DefaultHttpClient [INFO] I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error
2011-12-03 18:00:32 DefaultHttpClient [INFO] Retrying request”…

为此,我找遍了中英文的一些网站,搜遍了能找的每个角落,发现了出现这种状况的原理,该java异常在客户端和服务器端都有可能发生,引起该异常的原因有两个:

1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。

2,一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。

于是我简单的认为通过设置一些socket的timeout时间,就能解决:

但是设置以后情况依然是那样。

这个问题困扰了好几天,每天都在思考和对比测试中,以求发现造成这个原因代码的地方,我不禁思考,同样数量的关键词数量前提下,为什么之前批量查询排名数据没有出错,而最近会频繁报错,这到底是为什么?是被请求的接口网站屏蔽掉了我们的服务器ip?这个理由也不是很充分,肯定是程序中某个地方没有合理释放掉connection的连接导致!

在这个思路的指引下,通过几天连续的奋战和实践,今天终于发现了问题的本质,那就是那个timer的方法导致的!情况是这样的,这几天,我在手动触发一些批量任务,发现在过滤排名值为100的情况下,java的java.net.SocketException: Connection reset 这个错会一直抛出,而且刷屏特别厉害,在仔细对照了timer的这段代码

 

后,终于猛然醒悟,对!就是这里出问题了,我自己来分析一下:

一个函数值,它返回的值,是一个临界值,但是我这个timer的方法中,判断了返回的值如果是临界值的话,会迫使它在10秒内继续执行那个方法,而这个方法是要去获取一个页面中源代码的一个特定数据,每次这个方法执行会消耗掉几十毫秒的时间,即相当于在这个时间内,是建立了一个socket连接,但是由于它一直返回的是那个临界值,所以这个方法会在10秒内不停的建立socket连接以获取数据,如果这个方法每次执行时间大概是80ms(经过测试,每个这样的方法执行时间为80毫秒左右),在10秒时间内,会建立10*1000/80 = 125次socket连接,即每秒会建立起12.5个socket连接,再加上由于这个是过滤的程序,多个临界值的情况会连续出现在一起,所以,在短暂的几秒钟内,对同一个网站页面的socket连接数会飙升的很高,达到几百甚至上千,导致等待处理的请求连接数太高:

当初为什么会用这个定时器方法来让一个方法多执行几遍,原因就是为了获取一个数据的稳定值,但是现在想来,带来的负面影响代价是多么的大,产生的效果是不可小觑的,不过经过几天的综合分析和测试,终于还是发现了这个罪魁祸首,问题解决后,心,一下子豁然了,可以安心睡觉了。。。

相关文章

  • Java中迭代器Iterator的使用解析

    Java中迭代器Iterator的使用解析

    Java采用了迭代器来为各种容器提供了公共的操作接口,下面通过本文给大家分享Java中迭代器Iterator的使用解析,需要的朋友参考下吧
    2017-09-09
  • Java递归算法的使用分析

    Java递归算法的使用分析

    本篇文章介绍了,在Java中递归算法的使用分析。需要的朋友参考下
    2013-04-04
  • Spring Boot实现通用的接口参数校验

    Spring Boot实现通用的接口参数校验

    本文介绍基于 Spring Boot 和 JDK8 编写一个 AOP ,结合自定义注解实现通用的接口参数校验。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • java基于线程池和反射机制实现定时任务完整实例

    java基于线程池和反射机制实现定时任务完整实例

    这篇文章主要介绍了java基于线程池和反射机制实现定时任务的方法,以完整实例形式较为详细的分析了Java定时任务的功能原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Java操作Redis详细介绍

    Java操作Redis详细介绍

    这篇文章主要介绍了Java操作Redis详细介绍,涉及对key的操作,string数据类型,list数据类型等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Spring Boot集成spring-boot-devtools开发时实现热部署的方式

    Spring Boot集成spring-boot-devtools开发时实现热部署的方式

    这篇文章主要介绍了Spring Boot集成spring-boot-devtools开发时实现热部署的方式,文中还给大家提到了spring boot 实现热部署的方式及集成注意事项,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • java批量导入导出文件的实例分享(兼容xls,xlsx)

    java批量导入导出文件的实例分享(兼容xls,xlsx)

    这篇文章主要给大家介绍了利用java批量导入导出文件的相关资料,文中给出了详细的实例代码,并且兼容xls,xlsx,对大家具有一定的参考学习价值,下面跟着小编一起来看看详细的介绍吧。
    2017-06-06
  • 实例讲解Java并发编程之变量

    实例讲解Java并发编程之变量

    这篇文章主要介绍了实例讲解Java并发编程之变量,本文讲解了编写线程安全需要关心的共享变量和可变变量,需要的朋友可以参考下
    2015-04-04
  • java使用异或实现变量互换和异或加密解密示例

    java使用异或实现变量互换和异或加密解密示例

    这篇文章主要介绍了使用异或实现变量互换和异或加密解密示例,需要的朋友可以参考下
    2014-02-02
  • spring mvc路径匹配原则详解

    spring mvc路径匹配原则详解

    这篇文章主要介绍了spring mvc路径匹配原则详解,小编觉得还是挺不错的,这里分享给大家,需要的朋友可以参考下,下面就和小编一起来看看吧
    2018-02-02

最新评论