我正在尝试通过HttpClient设置HttpClientBuilder。我还看了HttpClientConnectionManager,混乱就开始了。
在ConnectionManager上或更确切地说在PoolingHttpClientConnectionManager上,有一些方法可以用于
何时认为连接已过期?
什么时候闲着?
当池中的连接关闭时会发生什么?是否可以确保在需要时重新创建连接?
答案 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连接以包含SYN
,SYN-ACK
和ACK
消息的TCP握手开始,而以FIN
,ACK-FIN
和{从Wikipedia
尽管HTTP是请求-响应协议,但是打开和关闭连接的成本很高,因此HTTP / 1.1允许重用现有的连接。使用标头ACK
,即,您告诉您的客户端(即浏览器)保持对服务器的开放连接。一台服务器可以同时拥有成千上万个打开的连接。为了避免耗尽服务器的资源,通常会及时限制连接。通过套接字超时,空闲服务器或具有某些连接问题(互联网访问中断等)的连接将在服务器经过一段预定义的时间后自动关闭。
大量的HTTP实现(例如Apache的HTTP客户端4.4及更高版本)仅在即将使用连接时检查其状态。
过时的连接的处理在版本4.4中进行了更改。以前,该代码默认情况下会在重新使用之前检查每个连接。现在,该代码仅在自上次使用连接以来所经过的时间超过已设置的超时时,才检查连接。默认超时设置为2000ms(Source)
如果因此一段时间未使用连接,则客户端可能未从服务器读取Connection: keep-alive
,因此,当服务器实际上已经关闭连接时,仍会认为该连接已打开。这样的连接已过期,通常称为半关闭。因此,它可能会被池收集。
请注意,如果您发送包含ACK-FIN
HTTP标头的请求,则应在客户端收到响应后立即关闭连接。
可以通过Connection: close
来检查打开的连接的状态,这在大多数现代操作系统中都应该存在。最近,我不得不检查一个通过第三方库管理的HTTP客户端,该第三方库没有正确传播netstat
头,因此导致大量的半封闭连接。