Faild to respond 問題處理spa
問題本質:HttpClient內部有鏈接池機制(PoolingHttpClientConnectionManager)
所以同一個httpclient的鏈接會被複用,當服務端關閉鏈接後,客戶端仍然使用該鏈接,則會拋出Faild to respond。線程
大體流程:blog
長鏈接出現:設置keepalive策略後,當服務端關閉時,客戶端的鏈接被回收,致使服務端的關閉請求被擱置,客戶端鏈接仍未關閉且繼續使用。it
拓展 :服務端keepalive 超時後會主動發送FIN、ACK ,而後客戶端發送ACK 正常狀況服務端應該返回FIN、ACK ,而這時客戶端緊接着發送RSTio
短鏈接出現:因爲代碼問題致使。cli
TCP短鏈接出現問題: TCP 鏈接會等待一會纔會關閉 因而 httpclient可能使用該鏈接一直髮送數據date
以後服務端發送FIN,ACK 請求關閉,httpclient仍然使用該鏈接發送數據PSH,ACKhttpclient
因而致使問題請求
解決策略:im
1)
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setValidateAfterInactivity(timeinmilliseconds);
2)
開啓線程定時檢測
HttpClientConnectionManager.closeExpiredConnections()、HttpClientConnectionManager.closeIdleConnections()
三、設置http重試策略 .setRetryHandler(new DefaultHttpRequestRetryHandler(5,true))