使用不同的Java库执行数百万个HTTP请求,会导致线程挂起:
java.net.SocketInputStream.socketRead0()
这是一个本地
函数。
我尝试设置Apache Http Client和RequestConfig
以在可能的情况下对所有内容进行超时,但仍然会出现在socketRead0
上有(可能是无限的)挂起。如何摆脱它们?
挂起比率约为每10000个请求(到10000个不同的主机)1个,它可能会永远持续下去(我确认线程挂起后仍然有效,持续了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);
注意:实际上我有一个“技巧”:我可以在其他Thread
中安排.getConnectionManager().shutdown()
,并在请求正常完成时取消Future
。但是,这已经被弃用,并且它会关闭整个HttpClient
,而不仅仅是单个请求。
HttpClientBuilder
وœ‰builder.disableRedirectHandling()
,而RequestConfig
وœ‰.setRedirectsEnabled(true)
,è؟™وک¯و£ç،®çڑ„هگ—ï¼ں - Anton Danilov