Apache HttpClient连接配置

时间:2019-02-04 11:32:19

标签: java connection-pooling apache-httpclient-4.x

我正在尝试通过HttpClient设置HttpClientBuilder。我还看了HttpClientConnectionManager,混乱就开始了。

在ConnectionManager上或更确切地说在PoolingHttpClientConnectionManager上,有一些方法可以用于

  • 关闭过期的连接
  • 关闭空闲连接

何时认为连接已过期?
什么时候闲着?
当池中的连接关闭时会发生什么?是否可以确保在需要时重新创建连接?

2 个答案:

答案 0 :(得分:1)

根据:https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

  

HttpClient尝试通过测试是否通过   连接是“陈旧的”,由于已关闭,因此不再有效   在服务器端,在使用连接来执行   HTTP请求。过时的连接检查不是100%可靠的。的   唯一不涉及每个套接字一个线程的可行解决方案   空闲连接的模型是用于驱逐的专用监视线程   由于长时间的连接而被视为过期的连接   不活动。监视线程可以定期调用   ClientConnectionManager#closeExpiredConnections()方法关闭所有   连接过期,并从池中退出关闭的连接。它还可以选择调用ClientConnectionManager#closeIdleConnections()方法来关闭在给定时间段内处于空闲状态的所有连接。

过期和空闲之间的区别在于,过期的连接已在服务器端关闭,而空闲连接不一定在服务器端已关闭,但它已经闲置了一段时间。关闭连接后,该连接将在要使用的池中再次变为可用。

答案 1 :(得分:0)

HTTP基于TCP,它管理以正确的顺序发送和接收包,并且如果包在途中丢失,则请求重新传输。 TCP连接以包含SYNSYN-ACKACK消息的TCP握手开始,而以FINACK-FIN和{从Wikipedia enter image description here

拍摄的这张图片可以看出{1}}系列

尽管HTTP是请求-响应协议,但是打开和关闭连接的成本很高,因此HTTP / 1.1允许重用现有的连接。使用标头ACK,即,您告诉您的客户端(即浏览器)保持对服务器的开放连接。一台服务器可以同时拥有成千上万个打开的连接。为了避免耗尽服务器的资源,通常会及时限制连接。通过套接字超时,空闲服务器或具有某些连接问题(互联网访问中断等)的连接将在服务器经过一段预定义的时间后自动关闭。

大量的HTTP实现(例如Apache的HTTP客户端4.4及更高版本)仅在即将使用连接时检查其状态。

  

过时的连接的处理在版本4.4中进行了更改。以前,该代码默认情况下会在重新使用之前检查每个连接。现在,该代码仅在自上次使用连接以来所经过的时间超过已设置的超时时,才检查连接。默认超时设置为2000ms(Source

如果因此一段时间未使用连接,则客户端可能未从服务器读取Connection: keep-alive,因此,当服务器实际上已经关闭连接时,仍会认为该连接已打开。这样的连接已过期,通常称为半关闭。因此,它可能会被池收集。

请注意,如果您发送包含ACK-FIN HTTP标头的请求,则应在客户端收到响应后立即关闭连接。

可以通过Connection: close来检查打开的连接的状态,这在大多数现代操作系统中都应该存在。最近,我不得不检查一个通过第三方库管理的HTTP客户端,该第三方库没有正确传播netstat头,因此导致大量的半封闭连接。