2013-10-12 2 views
0

В настоящее время я запускаю программу, которая будет загружать исходный код с веб-сайта с помощью Apache HttpComponents. Я буду загружать много (10 000 секунд), и поэтому я использую несколько потоков для этого.Apache HttpComponents код, вызывающий поток для блокировки

Иногда все нити умирают (присоединяются), а иногда и нет. Через отладку я определил, что проблема связана с линией

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

проблема. Кто-нибудь знает, как я могу установить тайм-аут для этой строки или почему эта строка блокирует выполнение потоков?

+0

Какой менеджер подключений вы используете? Вы должны использовать PoolingClientConnectionManager. – hooknc

ответ

1

Там могут быть различные причины для потоков застревают в операции ввода/вывода, неправильные настройки времени ожидания являются наиболее вероятной причиной. Можно установить желаемые значения таймаута, используя класс 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) 
Смежные вопросы