Faild to respond | recv failed 问题处理

走远了吗. 提交于 2019-11-30 12:24:16

Faild to respond 问题处理

问题本质:HttpClient内部有连接池机制(PoolingHttpClientConnectionManager
因此同一个httpclient的连接会被复用,当服务端关闭连接后,客户端仍然使用该连接,则会抛出Faild to respond。

大致流程:

  1. 客户端发送请求
  2. 服务端读第一个请求,处理,并返回
  3. 服务端关闭连接
  4. 客户端发送第二个请求
  5. 客户端尝试读取响应

 

长连接出现:设置keepalive策略后,客户端与服务端两边关闭时间不一致,并且当服务端关闭时,客户端的连接被回收或者所在线程没有时间片,导致服务端的关闭请求被搁置,客户端连接仍未关闭且继续使用。

短连接出现:由于代码问题导致。

 

 

解决策略:

  1. 使用短连接 keepalive 策略置为<0的数或者请求头中携带connection:close
  2. 清除旧连接

1)

PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();

connectionManager.setValidateAfterInactivity(timeinmilliseconds);

 

2)

开启线程定时检测

HttpClientConnectionManager.closeExpiredConnections()HttpClientConnectionManager.closeIdleConnections()

  1. 设置http重试策略 .setRetryHandler(new DefaultHttpRequestRetryHandler(5,true))

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!