【问题标题】:Unexpected connection close in HttpClientHttpClient 中的意外连接关闭
【发布时间】:2017-02-26 13:47:54
【问题描述】:

我在 Web 应用程序中遇到了 HttpClient(版本 4.5.2)的问题,我的意思是,以多线程方式。在正常情况下,当一个连接请求到达时,会从池中租用一个连接,然后使用并最终释放回池中,以便在以后的请求中再次使用,作为 id 673890 状态的连接日志的以下部分。

15 Feb 2017 018:25:54:115 p-1-thread-121 DEBUG PoolingHttpClientConnectionManager:249 - Connection request: [route: {}->http://127.0.0.1:8080][total kept alive: 51; route allocated: 4 of 100; total allocated: 92 of 500]
15 Feb 2017 018:25:54:116 p-1-thread-121 DEBUG PoolingHttpClientConnectionManager:282 - Connection leased: [id: 673890][route: {}->http://127.0.0.1:8080][total kept alive: 51; route allocated: 4 of 100; total allocated: 92 of 500]
15 Feb 2017 018:25:54:116 p-1-thread-121 DEBUG DefaultManagedHttpClientConnection:90 - http-outgoing-673890: set socket timeout to 9000
15 Feb 2017 018:25:54:120 p-1-thread-121 DEBUG PoolingHttpClientConnectionManager:314 - Connection [id: 673890][route: {}->http://127.0.0.1:8080] can be kept alive for 10.0 seconds
15 Feb 2017 018:25:54:121 p-1-thread-121 DEBUG PoolingHttpClientConnectionManager:320 - Connection released: [id: 673890][route: {}->http://127.0.0.1:8080][total kept alive: 55; route allocated: 4 of 100; total allocated: 92 of 500]

在我上面提到的以正常方式多次使用提到的连接(id 673890)后,我注意到代码中发生了以下情况:

15 Feb 2017 018:25:54:130 p-1-thread-126 DEBUG PoolingHttpClientConnectionManager:249 - Connection request: [route: {}->http://127.0.0.1:8080][total kept alive: 55; route allocated: 4 of 100; total allocated: 92 of 500]
15 Feb 2017 018:25:54:130 p-1-thread-126 DEBUG PoolingHttpClientConnectionManager:282 - Connection leased: [id: 673890][route: {}->http://127.0.0.1:8080][total kept alive: 54; route allocated: 4 of 100; total allocated: 92 of 500]
15 Feb 2017 018:25:54:131 p-1-thread-126 DEBUG DefaultManagedHttpClientConnection:90 - http-outgoing-673890: set socket timeout to 9000
15 Feb 2017 018:25:54:133 p-1-thread-126 DEBUG DefaultManagedHttpClientConnection:81 - http-outgoing-673890: Close connection
15 Feb 2017 018:25:54:133 p-1-thread-126 DEBUG PoolingHttpClientConnectionManager:320 - Connection released: [id: 673890][route: {}->http://127.0.0.1:8080][total kept alive: 55; route allocated: 3 of 100; total allocated: 91 of 500]

日志说连接被请求、租用、使用、关闭,然后释放回池。所以,我的问题是为什么连接被关闭?以及为什么关闭后会释放到池中?

我知道连接可能会被服务器关闭,但情况不同。在这种情况下,连接是从池中租用的,被确定为陈旧的,因此建立并使用了一个新连接,但我上面提供的日志显示了不同的行为。

我知道 HttpClient 中连接关闭的两个原因。首先,因为它们的 KeepAliveTime 已过期而因空闲而关闭。其次,被服务器关闭,这使得池中的连接陈旧。还有其他原因导致连接被关闭吗?

【问题讨论】:

    标签: httpclient apache-httpclient-4.x connection-close


    【解决方案1】:

    根据 Oleg Kalnichevski 在 HttpClient 邮件列表中的回复以及我所做的检查,结果发现问题是由于另一方面发送的 'Connection: close' 标头造成的。可能导致相同情况的另一个原因是使用 HTTP/1.0 非持久连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多