java - Apache HttpClient 连接配置

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

我正在尝试设置 HttpClient通过HttpClientBuilder 。我还看了HttpClientConnectionManager困惑就从这里开始了。

在 ConnectionManager 上或更确切地说是 PoolingHttpClientConnectionManager有一些方法可以:

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

什么时候连接被视为过期?
什么时候空闲?
当池中的连接关闭时会发生什么?是否确保在需要时重新创建连接?

最佳答案

HTTP 基于 TCP,它管理数据包以正确的顺序发送和接收,并在数据包中途丢失时请求重新传输。 TCP 连接以包含 SYNSYN-ACKACK 消息的 TCP 握手开始,并以 结束FINACK-FINACK 系列,如取自 Wikipedia 的图像所示enter image description here

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

许多 HTTP 实现(例如 Apache HTTP 客户端 4.4 及更高版本)仅在要使用连接时才检查连接的状态。

The handling of stale connections was changed in version 4.4. Previously, the code would check every connection by default before re-using it. The code now only checks the connection if the elapsed time since the last use of the connection exceeds the timeout that has been set. The default timeout is set to 2000ms (Source)

如果连接可能有一段时间没有被使用,客户端可能没有从服务器读取ACK-FIN,因此仍然认为连接是打开的,而实际上它已经被关闭了前段时间的服务器。这样的连接是过期的,通常称为半关闭。因此它可能会被池收集。

请注意,如果您发送的请求包含 Connection: close HTTP header ,则应在客户端收到响应后立即关闭连接。

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

关于java - Apache HttpClient 连接配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54515235/

相关文章:

java - 相当于 Jar 中的 this.getClass().getClassLoader().getResource (".").toURI()

java - Maven Intellij IDEA 无法 gwt 编译类

java - JPA:如何将实体与关系属性关联起来?

java - Java 中是否有类似于 C++ 的删除函数,以便将项目设置为 null 提示 GC?

javascript - 使用node杀死所有休眠的mysql池连接

java - Apache InternalHttpClient:确定本地端口号

java - 连接池的正确实现方法

jms - Camel jms 到外部 activeMQ 的请求-回复给出 javax.jms.InvalidDestinationException : Cannot publish to a deleted Destination:

apache-httpclient-4.x - spring-ws 已弃用 DefaultHttpClient

java - 写入 MediaWiki : Connection reset by peer