2013-10-12 78 views
0

我目前正在運行一個程序,它將使用Apache HttpComponents從網站下載源代碼。我將下載很多(10,000s),所以我使用多線程來做到這一點。導致線程阻塞的Apache HttpComponents代碼

有時候所有的線程都會死(加入),有時它們不會。通過調試我已經確定該行

CloseableHttpResponse response = httpClient.execute(httpget,context); 

是問題所在。有人知道我可以如何設置這條線的超時時間,或者爲什麼這條線阻止線程執行?

+0

中所述打開線/上下文日誌記錄,以瞭解有關請求執行的更多詳細信息。您正在使用什麼連接管理器?你應該使用PoolingClientConnectionManager。 – hooknc

回答

1

可以有各種原因線程被陷在一個I/O操作,不正確的超時設置是最有可能的原因。可以使用RequestConfig類設置所需的超時值。但是,如果所有線程在#execute內部立即被阻塞,則連接泄漏(連接池耗盡)的可能性會更大。確保你總是關閉CloseableHttpResponse實例,即使不關心響應或其內容。您可以按照logging guide

0

我使用HttpConnectionParams以下超時設置在我的代碼(HttpParams都送給了HttpClient構造函數):

org.apache.http.params.HttpConnectionParams.setConnectionTimeout(HttpParams, int) 
org.apache.http.params.HttpConnectionParams.setSoTimeout(HttpParams, int) 

連接到同一臺主機與多個線程的時候,那裏面我發現了一個問題阻止/當maxPerRoute設置低於線程數時會發生超時。看看PoolingClientConnectionManager

org.apache.http.impl.conn.PoolingClientConnectionManager.setDefaultMaxPerRoute(int)