博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《HttpClient官方文档》2.3 HTTP连接管理
阅读量:6972 次
发布时间:2019-06-27

本文共 2541 字,大约阅读时间需要 8 分钟。

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 processConnectionRequest connRequest = connMrg.requestConnection(route, null);// Wait for connection up to 10 secHttpClientConnection 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 200cm.setMaxTotal(200);// Increase default max connection per route to 20cm.setDefaultMaxPerRoute(20);// Increase max connections for localhost:80 to 50HttpHost 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();

转载自 

你可能感兴趣的文章
TortoiseGit连接github.com
查看>>
java基础( 九)-----深入分析Java的序列化与反序列化
查看>>
Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
查看>>
Lua C API 遍历 table
查看>>
数组A - 财务管理
查看>>
group by
查看>>
简单投票系统学到的一些东西
查看>>
android打电话,接电话,挂电话过程
查看>>
【LeanEAP.NET】精益企业应用平台实战----表格批量编辑与Undo/Redo功能实现
查看>>
从Excel中读取数据(python-xlrd)
查看>>
iframe显示高度自适应 兼容多浏览器
查看>>
Struts2 技术全总结 (正在更新)
查看>>
站在产品经理的角度看问题
查看>>
网络编程之urllib
查看>>
【转】WebView的JavaScript与本地代码三种交互方式
查看>>
xml转换为对象 微信接口
查看>>
HTML表单
查看>>
jzoj5984. 【北大2019冬令营模拟2019.1.1】仙人掌 (分块)
查看>>
电梯调度算法的实现
查看>>
前端之html5和css3
查看>>