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

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/114101.html

(0)
上一篇 2021年8月27日
下一篇 2021年8月27日

相关推荐

发表回复

登录后才能评论