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))

相關文章
相關標籤/搜索