使用httpclient時根據 CLOSE_WAIT 和 leased 判斷連接處理是否正確

 

1 CLOSE_WAIT  等待資源釋放

          對應socket中,客戶端就是等待inputStream關閉,服務端就是等待outputStream關閉。 可以通過 netstate 指令獲取連接情況。

 # netstat -t | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
      CLOSE_WAIT 27
      ESTABLISHED 28
      TIME_WAIT 4865

2 leased 連接池中正在使用的連接數

leased 連接池中正在使用的連接數  

available 連接池中可用的連接數  

(leased + available)爲創建的總連接數    

pending 存放等待獲取連接的線程的Future 

PoolingHttpClientConnectionManager.getTotalStats().toString()
[leased: 23; pending: 0; available: 2; max: 200]

3 問題

     程序運行一段時間,TCP等待釋放資源的連接數和httpclient中正在使用的連接數不下降,且數目接近。

4 原因

     httpclient未進行資源的釋放。

5 解決

     使用 EntityUtils.consume( entity ); 即可釋放資源。

6 分析

  EntityUtils.consume( entity ); 源碼:

public static void consume(HttpEntity entity) throws IOException {
        if(entity != null) {
            if(entity.isStreaming()) {
                InputStream instream = entity.getContent();
                if(instream != null) {
                    instream.close();
                }
            }

        }
    }

通過關閉InputStream,釋放TCP資源,同時等待HttpClient中的回收線程對連接進行回收(未標記重用的連接直接關閉)

 

參考:https://www.cnblogs.com/trust-freedom/p/6349502.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章