2017-02-26 107 views
1

我在Web应用程序中遇到了HttpClient(版本4.5.2)的问题,我的意思是以多线程的方式。在正常情况下,当连接请求到达时,从池中租用连接,然后再次使用并最终释放回池中,以便在将来的请求中再次使用该连接,如以下与ID为673890的连接日志部分所述。在HttpClient中关闭意外的连接

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] 

使用上述连接(编号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过期而被关闭。其次,由服务器关闭,使连接在池中失效。是否有任何其他原因关闭连接?

回答

0

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

相关问题