2014-03-04 27 views
0

任何人都可以幫助我闡明HttpClient在多線程中的行爲嗎?多線程和併發上下文中的HttpClient行爲

當我通過下面的代碼創建HttpClient對象,我應該保持物體全球整個應用程序生命週期(該方法被提及在HttpClient DOC),或者我應該創建每次當我想執行HTTP連接(獲取和郵政)?

1) 
Static HttpClient httpclient = HttpClientBuilder.create().build(); //so we can use this object in everywhere. 

2) 
HttpClient httpclient = HttpClientBuilder.create().build(); //do this every time when we want to establish http connect. 

確保Http連接不會彼此阻塞並確保它們可以同時運行的最佳方法是什麼?

+0

我的建議是第二個,因爲如果你使用靜態變量對象的併發訪問可能會拋出異常或意外的結果。在Jmeter(性能/負載測試工具)中,他們爲不同的線程創建不同的對象。但是,如果線程的數量很少,線程只做只讀,那麼你可以使用帶有同步方法的靜態變量。如果我說錯了,請糾正我。 –

回答

1

使用PoolingConnectionManager並配置每條路由需要多少個連接(確保您擁有與使用它們的線程一樣多的連接)。然後你可以簡單地在所有地方注入相同的httpclient。幾年來我一直在使用它。

也考慮到處使用ResponseHandlers;這極大地簡化了資源和連接的釋放。

+0

嗨,如果連接池有3個連接。但我的應用程序將同時需要4個連接。 「HttpClient」如何處理額外的一個? 「HttpClient」會創建一個臨時連接,還是額外的連接將不得不等待/掛起,直到池有空閒連接? – GMsoF

+0

呃..這是什麼意思「每條路線」?它是否意味着「每個應用的生命週期」? – GMsoF

+1

網絡路由。基本上,對於相同的路線,您可以重新使用連接。在由httpclient發佈後,連接池會嘗試重新使用到服務器的開放連接。這就是爲什麼池連接管理器很好。基本上你可以配置你想要發送的最大連接數量。如果超過這個數字,線程將最終等待連接被釋放。你也可以設置超時時間,你會看到超時。通常,您希望擁有與線程一樣多的連接。 –