Faild to respond | recv failed 问题处理

Faild to respond 问题处理spa

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

大体流程:blog

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

 

长链接出现:设置keepalive策略后,当服务端关闭时,客户端的链接被回收,致使服务端的关闭请求被搁置,客户端链接仍未关闭且继续使用。it

拓展 :服务端keepalive 超时后会主动发送FIN、ACK ,而后客户端发送ACK 正常状况服务端应该返回FIN、ACK ,而这时客户端紧接着发送RSTio

短链接出现:因为代码问题致使。cli

TCP短链接出现问题: TCP 链接会等待一会才会关闭 因而 httpclient可能使用该链接一直发送数据date

以后服务端发送FIN,ACK 请求关闭,httpclient仍然使用该链接发送数据PSH,ACKhttpclient

因而致使问题请求

 

 

解决策略:im

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

        1)

               PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();

               connectionManager.setValidateAfterInactivity(timeinmilliseconds);

 

     2)

             开启线程定时检测

             HttpClientConnectionManager.closeExpiredConnections()HttpClientConnectionManager.closeIdleConnections()

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

相关文章
相关标签/搜索