Faild to respond 问题处理
问题本质:HttpClient内部有连接池机制(PoolingHttpClientConnectionManager)
因此同一个httpclient的连接会被复用,当服务端关闭连接后,客户端仍然使用该连接,则会抛出Faild to respond。
大致流程:
- 客户端发送请求
- 服务端读第一个请求,处理,并返回
- 服务端关闭连接
- 客户端发送第二个请求
- 客户端尝试读取响应
长连接出现:设置keepalive策略后,客户端与服务端两边关闭时间不一致,并且当服务端关闭时,客户端的连接被回收或者所在线程没有时间片,导致服务端的关闭请求被搁置,客户端连接仍未关闭且继续使用。
短连接出现:由于代码问题导致。
解决策略:
- 使用短连接 keepalive 策略置为<0的数或者请求头中携带connection:close
- 清除旧连接
1)
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setValidateAfterInactivity(timeinmilliseconds);
2)
开启线程定时检测
HttpClientConnectionManager.closeExpiredConnections()、HttpClientConnectionManager.closeIdleConnections()
- 设置http重试策略 .setRetryHandler(new DefaultHttpRequestRetryHandler(5,true))