《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()方法時,它將被解除阻塞。
BasicHttpClientConnectionManage類是一個簡單的連接管理器,一次隻維護一個連接。即使這個類是線程安全的,也應該隻用於一個執行中的線程上。
BasicHttpClientConnectionManage類將努力使後續請求連接使用相同的路由。然而,當持久連接的路由不匹配連接請求的時候,它將關閉現有的連接並為給定路由重新打開一個連接。 如果連接已經被分配, 那將會拋出java.lang.IllegalStateException異常。
這個連接管理器的實現應該被用於在EJB容器內.
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();
當一個HttpClient 的實例不在被需要,即將超出範圍的時候,關閉它的連接管理器以確保管理器中所有存活的連接被關閉,以及為這些連接分配的係統資源被釋放是非常重要的。
CloseableHttpClient httpClient = <...> httpClient.close();
最後更新:2017-05-19 13:32:10