2017-02-26 325 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非持久連接。