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

Lun*_*orn 6 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();
Run Code Online (Sandbox Code Playgroud)

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

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

ok2*_*k2c 9

HttpClient教程中详细解释了此问题

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

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

  • @DerekY`PoolingHttpClientConnectionManager`在确认其到期时间仍在将来之后重新使用空闲连接.只是如果一段时间内没有请求,那些连接仍然是从客户端开放的(服务器通常在一段时间后关闭它们)使用资源.使用专用线程主动关闭这些连接可以更快地释放这些资源. (3认同)

小智 6

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