2012-11-08 61 views
2

的單一實例我使用的DefaultHttpClient一個單實例結合PoolingClientConnectionManager以在多線程方式執行HTTP操作的cconsiderable數量(每秒倍數)。我的代碼基本上是:超時與DefaultHttpClient

final HttpParams httpClientParams = new BasicHttpParams(); 
httpClientParams.setParameter("http.protocol.version", HttpVersion.HTTP_1_1); 
HttpConnectionParams.setConnectionTimeout(httpClientParams, 700); 
HttpConnectionParams.setSoTimeout(httpClientParams, 700); 
DefaultHttpClient client = new DefaultHttpClient(poolingClientConnectionManager, httpClientParams); 

那麼我就要從多個線程訪問client對象並行。

我的問題是,超時沒有得到尊重,我的HTTP請求比指定的700ms花費的時間長得多。

  • 是否安全,設置超時時間在客戶端上如我上面做什麼?
  • 對於很多平行請求使用單個實例DefaultHttpClient是否安全?
+0

看起來'PoolingClientConnectionManager'池太小,因此請求花了很長時間。擴大游泳池已經解決了這個問題。 – Frederic

回答

2
  • 是否安全,設置超時時間在客戶端上如我上面做什麼?

是的,它是安全的。但是,HttpClient級別參數表示由所有請求繼承的默認設置。人們不應該在運行時干涉這些設置。通常最好使用請求級別參數來配置個別請求。

  • 是可以安全使用DefaultHttpClient的單一實例許多並行請求?

不僅安全,而且強烈建議。通過共享相同的HttpClient實例,通過重新使用持久連接的共享池,可以更高效地執行各個請求。

另請確保您對超時行爲的期望是正確的。超時值表示兩個連續 I/O操作之間不活動的最大週期,而不是最大總請求執行時間。

+0

感謝您的回答,提供了一些見解!如果你有一個鏈接到所有這些說明的文檔,它會更好。 – Frederic

+0

@Fred HttpClient教程的任何特別錯誤? http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html – oleg