閱讀118 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《HttpClient官方文檔》2.3 HTTP連接管理

2.3. HTTP 連接管理

2.3.1. 管理連接和連接管理器

HTTP 連接是複雜的、 有狀態的、 非線程安全的對象,因此需要恰當的管理才能正常工作。HTTP連接一次隻能由一個線程使用。HttpClient使用實現了HttpClientConnectionManager接口,被稱為HTTP連接管理器的特殊實體去訪問HTTP連接。

HTTP連接管理器的作用是作為一個工廠類來為新的HTTP連接使用,管理持久連接的生命周期和同步訪問,確保一次隻能由一個線程使用連接。 HTTP連接管理器內部與ManagedHttpClientConnection接口的實例一起工作,作為真實連接的代理來管理連接狀態和控製I/O操作的執行。 如果一個受管的連接被它的使用者釋放或顯式關閉, 基礎連接將從它的代理服務器上分離,並返回給管理器。即使服務使用者仍然持有對代理實例的引用,它不再是能夠執行任何I/O操作或有意或無意地更改實際連接的狀態。

這是一個從連接管理器獲取連接的示例

HttpClientContext context = HttpClientContext.create();
HttpClientConnectionManager connMrg = new BasicHttpClientConnectionManager();
HttpRoute route = new HttpRoute(new HttpHost("localhost", 80));
// Request new connection. This can be a long process
ConnectionRequest connRequest = connMrg.requestConnection(route, null);
// Wait for connection up to 10 sec
HttpClientConnection conn = connRequest.get(10, TimeUnit.SECONDS);
try {
    // If not open
    if (!conn.isOpen()) {
        // establish connection based on its route info
        connMrg.connect(conn, route, 1000, context);
        // and mark it as route complete
        connMrg.routeComplete(conn, route, context);
    }
    // Do useful things with the connection.
} finally {
    connMrg.releaseConnection(conn, null, 1, TimeUnit.MINUTES);
}

如果有必要的話,連接請求可以通過調用ConnectionRequest#cancel()方法來提前終止。當線程阻塞在 ConnectionRequest#get()方法時,它將被解除阻塞。

2.3.2. 簡單連接管理器

BasicHttpClientConnectionManage類是一個簡單的連接管理器,一次隻維護一個連接。即使這個類是線程安全的,也應該隻用於一個執行中的線程上。
BasicHttpClientConnectionManage類將努力使後續請求連接使用相同的路由。然而,當持久連接的路由不匹配連接請求的時候,它將關閉現有的連接並為給定路由重新打開一個連接。 如果連接已經被分配, 那將會拋出java.lang.IllegalStateException異常。

這個連接管理器的實現應該被用於在EJB容器內.

2.3.3. 池連接管理器

PoolingHttpClientConnectionManager是更複雜的實現類,它管理客戶端連接池,並能向多個執行中的線程提供連接請求。在每條路由的基礎上匯總連接。如果在管理器連接池中有一條可用的持久連接,它將租用該條連接提供給請求的路由,而不會創建一條全新的連接。

PoolingHttpClientConnectionManager類在每個路由和總數的基礎上保持最大的連接數。 默認情況下,這個實現類為每條路由創建不超過2個並發連接,總計不超過20個連接。對於許多現實世界的應用來說,這些限製太過約束,尤其是他們使用HTTP作為傳輸協議為他們服務的時候。

這是一個展示如何調整連接池默認參數的示例:

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
// Increase max total connection to 200
cm.setMaxTotal(200);
// Increase default max connection per route to 20
cm.setDefaultMaxPerRoute(20);
// Increase max connections for localhost:80 to 50
HttpHost localhost = new HttpHost("locahost", 80);
cm.setMaxPerRoute(new HttpRoute(localhost), 50);

CloseableHttpClient httpClient = HttpClients.custom()
        .setConnectionManager(cm)
        .build();

2.3.4. 關閉連接管理器

當一個HttpClient 的實例不在被需要,即將超出範圍的時候,關閉它的連接管理器以確保管理器中所有存活的連接被關閉,以及為這些連接分配的係統資源被釋放是非常重要的。

CloseableHttpClient httpClient = <...>
httpClient.close();

轉載自 並發編程網 - ifeve.com

最後更新:2017-05-19 13:32:10

  上一篇:go  《雲數據管理:挑戰與機遇》2.1.5 基於廣播和多播的組通信
  下一篇:go  《HttpClient官方文檔》4.1-4.3 HTTP驗證