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