java setsolinger_如何防止Java中的SocketInputStream.socketRead0挂起?

使用不同的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请求,不仅是单个请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值