【问题标题】:java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STOPPEDjava.lang.IllegalStateException:请求无法执行; I/O 反应器状态:已停止
【发布时间】:2016-05-22 21:08:45
【问题描述】:

我有一个服务,预计以大约 5 个或更多请求/分钟的速度执行请求。该服务依赖于 Apache AsyncHttpClient。每隔几分钟,客户端就会遇到一些导致 java.lang.IllegalStateException: Request cannot be executed; I/O 反应器状态:已停止。对客户端的所有请求都以相同的异常消息开始失败。服务重启后,此循环重复。

这个问题真的很难调试,因为请求执行失败出人意料地不会导致回调到 AsyncResponse 的 failed() 方法。

据我所知,HttpCore NIO 中有一个修复 HTTPCORE-370,它解决了 4.3.2 中的类似问题。我正在使用以下版本 -

commons-httpclient-3.1.jar
httpasyncclient-4.1.1.jar
httpcore-4.4.4.jar
httpcore-nio-4.4.4.jar

但看到这个问题。

【问题讨论】:

  • 来晚了,你找到解决这个问题的办法了吗?

标签: java http apache-httpcomponents apache-httpasyncclient


【解决方案1】:

我们遇到了同样的问题,经过大量挖掘后,我们发现需要向 HttpAsyncClient 提供正确的IOReactorExceptionHandler 以避免这种情况。不幸的是,文档中没有很好地涵盖它。

下面是我们代码的 sn-p,其中更强大的客户端构建器尝试添加异常处理程序。请注意,IOExceptions 仍然会停止 I/O 反应器,因为它们可能意味着底层网络通信失败。您可以根据自己的独特用例进行调整。

 public RobustCloseableHttpAsyncClientBuilder withDefaultExceptionHandler() {
    return withExceptionHandler(
        new IOReactorExceptionHandler() {

          @Override
          public boolean handle(RuntimeException ex) {
            logger.error(
                "RuntimeException occurs in callback, handled by default exception handler and the I/O reactor will be resumed.",
                ex);
            return true;
          }

          @Override
          public boolean handle(IOException ex) {
            logger.error(
                "IOException occurs in callback, handled by default exception handler and the I/O reactor will be stopped.",
                ex);
            return false;
          }
        });
  }

在 Github 上的 elasticsearch 中阅读此 issue report 以获得更多曝光。

【讨论】:

    【解决方案2】:

    在我的例子中,使用 Elasticsearch 高级客户端,这个异常是由于esclient.indexAsync(indexRequest,RequestOptions.DEFAULT,null)

    我通过在所有异步请求中添加一个动作监听器来修复它

    esclient.indexAsync(indexRequest,RequestOptions.DEFAULT, 
                  new ActionListener<IndexResponse>() {
    
                        @Override
    
                        public void onResponse(IndexResponse response) {
    
                        }
                        @Override
                        public void onFailure(Exception e) {
    
                    });
    

    【讨论】:

    • 发生在哪个版本的 Elasticsearch 客户端?
    【解决方案3】:

    如果您在此之前看到 OutOfMemoryError,请尝试此操作

    -XX:MaxDirectMemorySize=512M

    https://issues.apache.org/jira/browse/HTTPASYNC-104

    【讨论】:

      【解决方案4】:

      我一直在我的应用程序中处理同样的异常,我终于从这篇文章中找到了一个有用的建议 - http://httpcomponents.10934.n7.nabble.com/I-O-reactor-status-STOPPED-td29059.html

      您可以使用 I/O 反应器的#getAuditLog() 方法来准确找出 什么异常导致它终止。

      如果您保留对 ConnectionManager 的 IOReactor 的引用,则可以调用此方法来深入了解实际问题:

      http://hc.apache.org/httpcomponents-core-4.4.x/httpcore-nio/apidocs/org/apache/http/impl/nio/reactor/AbstractMultiworkerIOReactor.html#getAuditLog()

      原来我在自己的代码中做了一些非常愚蠢的事情。但是直到我阅读了审计日志,我才弄明白。

      【讨论】:

      • 两个有同样的问题,你能分享你的原因吗?
      • 我的问题与我的代码的业务逻辑有关。在这种情况下,我试图两次停止同一个 Google Guava StopWatch。您在 IOReactor 的审核日志中找到的内容可能与您编写的代码非常相关。
      • 您的链接都不起作用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      相关资源
      最近更新 更多