Выполнение миллионов HTTP-запросов с различными библиотеками Java дает мне зависание:
java.net.SocketInputStream.socketRead0()
Какая функция native
.
Я попытался настроить Apche Http Client и RequestConfig
, чтобы иметь тайм-ауты на (надеюсь) каждый, что возможно, но все же, Я (возможно, бесконечный) зависает на socketRead0
. Как избавиться от них?
Отношение Хонга составляет около ~ 1 на 10000 запросов (до 10000 разных хостов), и оно может длиться, вероятно, навсегда (я подтвердил, что поток по-прежнему действует после 10 часов).
JDK 1.8 на Windows 7.
Мой HttpClient
factory:
SocketConfig socketConfig = SocketConfig.custom()
.setSoKeepAlive(false)
.setSoLinger(1)
.setSoReuseAddress(true)
.setSoTimeout(5000)
.setTcpNoDelay(true).build();
HttpClientBuilder builder = HttpClientBuilder.create();
builder.disableAutomaticRetries();
builder.disableContentCompression();
builder.disableCookieManagement();
builder.disableRedirectHandling();
builder.setConnectionReuseStrategy(new NoConnectionReuseStrategy());
builder.setDefaultSocketConfig(socketConfig);
return HttpClientBuilder.create().build();
Мой RequestConfig
factory:
HttpGet request = new HttpGet(url);
RequestConfig config = RequestConfig.custom()
.setCircularRedirectsAllowed(false)
.setConnectionRequestTimeout(8000)
.setConnectTimeout(4000)
.setMaxRedirects(1)
.setRedirectsEnabled(true)
.setSocketTimeout(5000)
.setStaleConnectionCheckEnabled(true).build();
request.setConfig(config);
return new HttpGet(url);
Примечание: на самом деле у меня есть "трюк" - я могу запланировать .getConnectionManager().shutdown()
в другом Thread
с отменой Future
, если запрос закончен правильно, но он развращен, а также убивает целых HttpClient
, не только этот единственный запрос.