Performing миллионы HTTP запросов с различными библиотеками Java дают мне темы, вешали на:Как предотвратить зависания на SocketInputStream.socketRead0 в Java?
java.net.SocketInputStream.socketRead0()
который является native
функцией.
Я пытался настроить Apche HTTP Client и RequestConfig
иметь тайм-ауты (я надеюсь) everythig, что возможно, но до сих пор, у меня есть (возможно бесконечное) висит на socketRead0
. Как избавиться от них?
Компонент Hung составляет около ~ 1 на 10000 запросов (до 10000 различных хостов), и он может длиться, вероятно, навсегда (я подтвердил, что поток висел по-прежнему действует через 10 часов).
JDK 1.8 на Windows 7.
Мой HttpClient
завод:
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
завод:
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
, а не только тот единственный запрос.
Ну, они собираются заблокировать до тех пор, пока не поступят данные или не истечет время ожидания. Вы имеете в виду, что эти потоки постоянно заблокированы и не синхронизированы? – EJP
Да, я имею в виду, что он вешает вечно (я проверил через 6 часов scenerio) –
Правильно ли, что 'HttpClientBuilder' имеет' builder.disableRedirectHandling() 'и' RequestConfig' имеет '.setRedirectsEnabled (true)'? –