1. 程式人生 > >《HttpClient官方文件》2.3 HTTP連線管理

《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();