如何防止在Java中的SocketInputStream.socketRead0上挂起?
使用不同的Java库执行数百万个HTTP请求会给我带来挂起的线程:
java.net.SocketInputStream.socketRead0()
这是功能。native
我试图设置Apche Http客户端,并在(我希望)每个可能的超时上都有超时,但是我仍然(可能是无限的)挂在socketRead0
上。如何摆脱它们?RequestConfig
挂起比率约为每10000个请求(对10000个不同的主机)约1个,它可能永远持续下去(我已经确认线程挂起在10小时后仍然有效)。
Windows 7 上的 JDK 1.8。
我的工厂: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