apache httpclient连接配置

nafvub8i  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(567)

我正在尝试通过httpclientbuilder设置httpclient。我还查看了httpclientconnectionmanager,这里开始出现混乱。
在connectionmanager或更确切地说在PoolighttpClientConnectionManager上,有以下方法:
关闭过期的连接
关闭空闲连接
连接何时被视为过期?
什么时候空闲?
当池中的连接关闭时会发生什么情况?是否确保在需要时重新创建连接?

vx6bjr1n

vx6bjr1n1#

根据:https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html
httpclient试图通过测试连接是否“过时”来缓解问题,因为在使用连接执行http请求之前,该连接在服务器端已关闭,因此不再有效。陈旧的连接检查不是100%可靠。唯一可行的解决方案不涉及空闲连接的每个套接字一个线程模型,它是一个专用的监视线程,用于排除由于长时间不活动而被视为过期的连接。monitor线程可以定期调用clientconnectionmanager#closeexpiredconnections()方法来关闭所有过期的连接,并从池中逐出关闭的连接。它还可以选择调用clientconnectionmanager#closeidleconnections()方法来关闭在给定时间段内处于空闲状态的所有连接。
过期连接和空闲连接的区别在于,服务器端的过期连接已关闭,而服务器端的空闲连接不一定关闭,但它在一段时间内处于空闲状态。当连接关闭时,它将在池中再次可用。

bwitn5fc

bwitn5fc2#

http是基于tcp的,它管理包以正确的顺序发送和接收,如果包中途丢失,它会请求重新传输。tcp连接通过tcp握手启动,握手包括 SYN , SYN-ACK 以及 ACK 消息以 FIN , ACK-FIN ,和 ACK 从这张来自维基百科的图片中可以看出

虽然http是一种请求-响应协议,但打开和关闭连接的成本相当高,因此http/1.1允许重用现有连接。带收割台 Connection: keep-alive i、 e.告诉客户机(即浏览器)保持与服务器的连接打开。一个服务器可以同时有成千上万个打开的连接。为了避免耗尽服务器的资源,通常会及时限制连接。通过套接字超时,空闲连接或存在某些连接问题的连接(断开的internet访问…)将在一段预定义的时间后由服务器自动关闭。
许多http实现(如ApacheHTTPClient4.4及更高版本)只在连接即将使用时才检查连接的状态。
旧连接的处理在版本4.4中已更改。以前,代码会在重新使用之前默认检查每个连接。现在,代码只在自上次使用连接以来经过的时间超过设置的超时时检查连接。默认超时设置为2000ms(源)
因此,如果某个连接可能有一段时间没有被使用,则客户端可能没有读取该连接 ACK-FIN 从服务器,因此仍然认为连接是打开的,而实际上它已经被服务器关闭了一段时间。这种连接已过期,通常称为半关闭。因此可以由池收集。
请注意,如果您发送的请求中包含 Connection: close http头,连接应在客户端收到响应后立即关闭。
打开连接的状态可以通过 netstat 它应该出现在大多数现代操作系统中。我最近不得不检查我们的一个http客户机,该客户机是通过第三方库管理的,该库不传播 Connection: Close 因此导致大量半封闭连接。

相关问题