当前位置: 首页 > 面试题库 >

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

易修洁
2023-03-14
问题内容

使用不同的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);

OpenJDK
socketRead0源码

注意:实际上,我有一些“技巧”-
如果请求正确完成,我可以安排.getConnectionManager().shutdown()其他Thread的取消操作Future,但是它被取消了权限,并且杀死了整个HttpClient请求,不仅是单个请求。


问题答案:

对于Apache HTTP客户端(阻止),我发现最好的解决方案是getConnectionManager()。并关闭它。

因此,在高可靠性解决方案中,我只计划在其他线程中关闭,如果请求未完成,我将从其他线程中关闭



 类似资料:
  • 问题内容: 我正在使用ColdFusion MX7对某些Java 6代码执行CFEXECUTE。 不幸的是,由于CF7在JDK 6下不起作用,所以我必须这样做。 我的问题是,如果在Java代码中发生异常,如果我在异常上调用a ,则CFEXECUTE命令会挂起。ColdFusion最终超时,但是Java进程继续在后台挂起。 我猜有一些障碍正在发生,但我似乎无法弄清楚为什么。 如果我不这样做,那么一切

  • 我试图获取代码,以防止用户输入中包含数字。 基本上,我希望代码如下所示: 请求输入 关键是(为什么这不是一个重复的问题):我不能使用循环或其他我们还没有学会的语句。到目前为止,我们所学的唯一真正的语句是if/else/else if语句。这意味着我不能像一些答案所建议的那样使用for循环。虽然它们是很好的答案,而且很有效,但我会因为使用它们而失分。 我已经有了这个,但我不知道如何测试输入是否只包含

  • 问题内容: 我正在使用ColdFusion MX7对某些Java 6代码执行CFEXECUTE。 不幸的是,由于CF7在JDK 6下不起作用,所以我必须这样做。 我的问题是,如果在Java代码中发生异常,如果我在异常上调用a ,则CFEXECUTE命令会挂起。最终超时,但是Java进程继续在后台挂起。 我猜有一些障碍正在发生,但我似乎无法弄清楚为什么。 如果我不这样做,那么一切正常。 异常是从Or

  • 问题内容: 我有一个看起来像这样的东西: 我的问题是s在垂直方向上会变得很大。我只希望它们对于一行来说足够高,因为这是用户可以在其中键入的全部内容。按钮很好(它们不会垂直扩展)。 有什么方法可以防止s扩展?我是Swing的新手,所以如果我做的所有事情都太糟糕了,请告诉我。 问题答案:

  • 如何实现防止XSS的Java ESAPI? 除了在构建路径中添加ESAPI jar之外,还需要其他配置吗? 提前感谢您的回答。

  • 我有一个命名管道文件,如下所示: 当我在PHP中执行类似操作时: 它挂起(即永不返回)。是否有办法使此呼叫返回和/或超时? (编辑) 请注意,我希望一个进程以写权限打开此管道,另一个进程以读权限打开此管道。有人在向这根管子写信,而另一个人在从这根管子读书。问题是读者有时会挂在fopen()上——不管它成功与否,我总是想返回它。