《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();
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 《HttpClient官方文档》2.3 HTTP连接管理
暂无评论