使用不同的Java库执行数百万个HTTP请求,使我陷入困境:
java.net.SocketInputStream.socketRead0()
这是native功能。
我试图设置Apche Http Client,并RequestConfig在所有可能的超时(我希望)上超时,但仍然
(可能无限)挂起socketRead0。如何摆脱它们?
挂断率大约是每10000个请求〜1(对10000个不同的主机),并且可能会永远持续下去(我已确认线程挂起在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请求,不仅是单个请求。