java - Apache HttpClient : How to auto close connections by server's keep-alive time?

标签 java apache-httpclient-4.x

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 秒的保持 Activity 时间。 当服务器启动关闭连接过程时,它一直处于 FIN_WAIT2 状态,直到我执行 connectionManager.shutdown()connectionManager.closeExpiredConnections()connectionManager.closeIdleConnections( 5、TimeUnit.SECONDS) 手动。服务器等待 FIN 包。服务器开始关闭进程后,如何在客户端自动关闭连接?

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

最佳答案

此问题在HttpClient tutorial 中有详细说明。

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

如果您希望过期连接被主动从连接池中逐出,则没有办法运行额外的线程来强制执行适合您的应用程序的连接逐出策略。

关于java - Apache HttpClient : How to auto close connections by server's keep-alive time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18697290/

相关文章:

java - Hadoop如何在 "real-time"针对非陈旧数据运行?

Java:同时从队列中删除对象。

java - 使用 Yahoo Finance API 检索股票行情

java - 如何使用 Apache HttpClient 获得持久的 HttpConnection?

java - 如何在 Apache HttpClient 中使用 SSL 客户端证书?

java - 尽管提供了高堆空间,但 JVM 内存不足

java - Java Records实际上是通过类似的类声明来节省内存还是它们更像语法糖?

java - 求一组二次方程的解

java - 如何在 HttpEntity 对象内设置 ContentType?

java - WinRM(WsMan) 和 NTLM 身份验证