FunTester httpclient 遇到 socket closed 解决办法

FunTester · 2020年03月30日 · 1031 次阅读

本人在做接口功能自动化测试的过程中遇到一个一个问题,如果请求过于频繁后,总会报一个 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 才能执行下一个链接。

 
我代码出现这个问题的原因是在链接释放后,服务端主动关闭了这个链接。我又查了一些资料,印证了自己的猜想,因为这个方法实在连接池使用的过程中释放链接的办法,连接池管理器就会关闭这个链接重复让别的请求使用。至此,问题找到了。

往期文章精选

  1. java 一行代码打印心形
  2. Linux 性能监控软件 netdata 中文汉化版
  3. 接口测试代码覆盖率(jacoco)方案分享
  4. 性能测试框架
  5. 如何在 Linux 命令行界面愉快进行性能测试
  6. 图解 HTTP 脑图
  7. 写给所有人的编程思维
  8. 将 json 数据格式化输出到控制台
  9. 如何测试概率型业务接口
  10. 将 swagger 文档自动变成测试代码
  11. Mac+httpclient 高并发配置实例
  12. httpclient 处理多用户同时在线

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册