本人在做接口功能自动化测试的过程中遇到一个一个问题,如果请求过于频繁后,总会报一个 java.net.SocketException: socket closed 异常,在研究完代码之后发现了一个问题,在请求结束之后我做一个释放释放链接的方法。
很早之前写的这个了,没想到访问量还挺高,为了不误人子弟特意来补充:本人用的 httpclient 包是 4.5.5,releaseConection()方法已经弃用了。用现在的 PoolingHttpClientConnectionManager 来管理连接池,不需要这个方法。
异常想信息如下:
java.net.SocketException: socket closed
下面是我的错误代码:
request.releaseConnection();//此处容易造成socket close
我想了一下,查阅了一些资料,这个 releaseconnection() 的方法,是释放该链接之后并不关闭,这样这个链接就可以重复使用了。官方的文档中表达如下:
This is a crucial step to keep things flowing. We must tell HttpClient that we are done with the connection and that it can now be reused. Without doing this HttpClient will wait indefinitely for a connection to free up so that it can be reused.
翻译过来的意思大概是,这个是资源流动利用的关键。必须告诉 httpclient,这个链接释放掉可以被重复使用。使用这个方法的好处就是,不需要等待有一个空闲的 httpclient 才能执行下一个链接。
我代码出现这个问题的原因是在链接释放后,服务端主动关闭了这个链接。我又查了一些资料,印证了自己的猜想,因为这个方法实在连接池使用的过程中释放链接的办法,连接池管理器就会关闭这个链接重复让别的请求使用。至此,问题找到了。