8

Apache HttpClient 4.3b2,HttpCore 4.3。

我用来PoolingHttpClientConnectionManager同时管理 5 个连接:

PoolingHttpClientConnectionManager connectionManager;
HttpClient httpclient;
connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setDefaultMaxPerRoute(5);
httpclient = HttpClientBuilder.create().setConnectionManager(connectionManager).build();

服务器有 5 秒的存活时间。当服务器启动关闭连接过程时,它会保持在 FIN_WAIT2 状态,直到我手动执行或connectionManager.shutdown()执行。服务器等待 FIN 包。服务器开始关闭过程后,如何自动关闭客户端的连接?connectionManager.closeExpiredConnections()connectionManager.closeIdleConnections(5, TimeUnit.SECONDS)

当我从 Chrome 浏览器发出请求时,服务器在尝试通过 keep-alive 关闭连接时保持在 TIME_WAIT 状态(FIN_WAIT2 状态变化非常快)。如何使用 Apache HttpClient 获得相同的行为?

4

3 回答 3

11

这个问题在HttpClient 教程中有详细解释

经典阻塞 I/O 模型的主要缺点之一是网络套接字只有在 I/O 操作中阻塞时才能对 I/O 事件做出反应。当连接释放回管理器时,它可以保持活动状态,但是它无法监视套接字的状态并对任何 I/O 事件做出反应。如果连接在服务器端关闭,则客户端连接无法检测到连接状态的变化(并通过关闭其末端的套接字来做出适当的反应)。

如果您希望从连接池中主动驱逐过期的连接,则无法运行额外的线程来执行适合您的应用程序的连接驱逐策略。

于 2013-09-09T14:58:28.490 回答
6

PoolingHttpClientConnectionManager课堂上,有一种方法setValidateAfterInactivity可以设置连接不活动的时间(以毫秒为单位)。如果超过了这个时间,连接池会在将连接传递给 HttpClient 之前重新验证连接。此方法从 v.4.4 开始可用。在以前的版本RequestConfig.Builder.setStaleConnectionCheckEnabled中,可以使用方法。

于 2018-06-11T12:58:47.850 回答
0

我在处理基于 Apache HttpClient 5 的客户端实现时多次发现这个问题,以确定是否仍然需要空闲的 http 连接监视器。

显然,从 Apache HttpClient 4.4 开始,org.apache.hc.client5.http.impl.IdleConnectionEvictor它完全符合HttpClient 教程中描述的内容(教程中没有提到)。

认为对其他人也了解这一点可能很有用。

于 2021-10-18T10:57:22.503 回答