Apache HttpClient:如何通过服务器的保持活动时间自动关闭连接?

时间:2013-09-09 11:32:20

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

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

2 个答案:

答案 0 :(得分:9)

HttpClient tutorial

详细说明了这个问题

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

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

答案 1 :(得分:1)

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