java Apache HttpClient连接配置
我正试图通过HttpClientBuilder设置一个HttpClient。我还看了一下HttpClientConnectionManager,然后开始感到困惑
在ConnectionManager或更确切地说PoolingHttpClientConnectionManager上,有以下方法:
- 关闭过期的连接
- 关闭空闲连接
连接何时被视为过期
什么时候空闲
当池中的连接关闭时会发生什么?是否确保在需要时重新创建连接
你可以在下面搜索框中键入要查询的问题!
我正试图通过HttpClientBuilder设置一个HttpClient。我还看了一下HttpClientConnectionManager,然后开始感到困惑
在ConnectionManager或更确切地说PoolingHttpClientConnectionManager上,有以下方法:
连接何时被视为过期
什么时候空闲
当池中的连接关闭时会发生什么?是否确保在需要时重新创建连接
# 1 楼答案
HTTP是基于TCP的,它管理以正确的顺序发送和接收包,并在包中途丢失时请求重新传输。TCP连接是通过由
SYN
、SYN-ACK
和ACK
消息组成的TCP握手开始的,而它是通过FIN
、ACK-FIN
和ACK
序列结束的,这可以从Wikipedia拍摄的图像中看到虽然HTTP是一种请求-响应协议,但打开和关闭连接的成本相当高,因此HTTP/1.1允许重用现有连接。使用头
Connection: keep-alive
,即告诉客户机(即浏览器)保持与服务器的连接打开。一台服务器可以同时打开成千上万个连接。为了避免耗尽服务器的资源,通常会及时限制连接。通过套接字超时空闲连接或存在某些连接问题的连接(断开的互联网访问…)在一段预定义的时间后,服务器会自动关闭很多HTTP实现,如Apaches HTTP client 4.4及更高版本,只在连接即将使用时才检查连接的状态
因此,如果一个连接可能有一段时间没有被使用,那么客户端可能没有从服务器读取
ACK-FIN
,因此当服务器在一段时间前实际上已经关闭连接时,仍然认为该连接是打开的。这种连接已过期,通常称为半关闭。因此,可以由池收集请注意,如果发送包含
Connection: close
HTTP头的请求,则应在客户端收到响应后立即关闭连接打开连接的状态可以通过
netstat
检查,这应该出现在大多数现代操作系统上。我最近不得不检查我们的一个HTTP客户机,该客户机是通过第三方库管理的,该库没有正确传播Connection: Close
头,因此导致大量半封闭连接# 2 楼答案
根据:https://hc.apache.org/httpcomponents-client-4.5.x/current/tutorial/html/connmgmt.html#d5e418
过期和空闲之间的区别在于,过期连接在服务器端已关闭,而空闲连接在服务器端不一定关闭,但在一段时间内处于空闲状态。当连接关闭时,它在要使用的池中再次可用