SocketException引发之迷局破解

今天工作中碰到一个问题,一网省公司通过一平台(集成平台)采集抽取另外一平台(管控平台)的数据时在耗费大概600S之后直接抛出了一个如下Socket异常
java.io.IOException:
java.net.SocketException: Software caused connection abort: socket write error
 at java.net.SocketOutputStream.socketWrite0(Native Method)
 at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
 at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
 at weblogic.servlet.internal.ChunkOutput.writeChunkTransfer(ChunkOutput.java:525)
 at weblogic.servlet.internal.ChunkOutput.writeChunks(ChunkOutput.java:504)
 at weblogic.servlet.internal.ChunkOutput.flush(ChunkOutput.java:382)
 at weblogic.servlet.internal.CharsetChunkOutput.flush(CharsetChunkOutput.java:249)
 at weblogic.servlet.internal.ChunkOutput.checkForFlush(ChunkOutput.java:469)
 at weblogic.servlet.internal.CharsetChunkOutput.implWrite(CharsetChunkOutput.java:396)
 at weblogic.servlet.internal.CharsetChunkOutput.write(CharsetChunkOutput.java:198)
 at weblogic.servlet.internal.ChunkOutputWrapper.write(ChunkOutputWrapper.java:133)
 at weblogic.servlet.internal.ServletOutputStreamImpl.write(ServletOutputStreamImpl.java:168)
接着,导致整个抽取中断,从发回的管控日志分析,一开始关注点只片面地关注到了IO的异常,会关注此原因在于日志前后有大量的字符串数据集(上万行)输出,初步怀疑是否由于读写资源争用导致,在进一步分析之后排除此种情形;在发回的日志里,还涉及到各种各样的Exception,而抛出时间点上也是在做上报下发,这一定程度上加大了排查的难度;再最后排除完管控集群各个节点的事务时间与线程时间设置没问题之后,还是得回归到java.net.SocketException的异常上来。

 

此异常的抛出,通常情况下,客户端(调用者)在调用并接收某Webservice或者服务端的方法返回数据时,突然中断引起,所以引起此异常的原因,不仅与被调用者(管控服务端)的服务配置有关之外,还与调用者息息相关,而此次的调用者乃——集成平台

 

发回集成平台日志分析,果然发现同样抛异常,在排除掉管控方面的问题之后,基本可以判定是由于集成平台的服务器(Tomcat)相关session连接超时配置有问题导致,由于Tomcat采用数据库连接池技术,当用户在一定时间不对数据库有操作时间后,就自动关闭当前连接,而在600S之后,集成平台调用管控的session中断了,也间接导致管控抽取中断,所以顺理成章,此次管控所抛异常并非主因,而恰好只是集成平台抛错的结果。


解决方案:集成平台方面需要调大服务器的相关连接时间,以确保整个调用过程在足够的时间内顺利完成。


 

posted @ 2011-07-26 21:28  Sunshine.Wu  阅读(8392)  评论(0)    收藏  举报