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获得相同的行为?
答案 0 :(得分:9)
经典阻塞I / O模型的一个主要缺点是网络套接字只有在I / O操作中被阻止时才能对I / O事件作出反应。当连接释放回管理器时,它可以保持活动状态,但它无法监视套接字的状态并对任何I / O事件做出反应。如果连接在服务器端关闭,则客户端连接无法检测到连接状态的变化(并通过关闭其末端的套接字来做出适当的反应)。
如果您希望过期连接从连接池中主动逐出,则无法运行其他线程来强制执行适合您应用程序的连接驱逐策略。
答案 1 :(得分:1)
在PoolingHttpClientConnectionManager
类中,有一个方法setValidateAfterInactivity
,用于设置连接不活动的时间段(以毫秒为单位)。如果超过此时间段,连接池会在将连接传递给HttpClient之前重新验证连接。
从v.4.4开始,此方法可用。
在以前的版本中,可以使用RequestConfig.Builder.setStaleConnectionCheckEnabled
方法。