java.lang.IllegalStateException:无法执行请求; I / O反应器状态:已停止

时间:2016-02-11 21:27:04

标签: apache http apache-httpasyncclient

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

调试此问题非常困难,因为请求执行失败令人惊讶地不会导致回调AsyncResponse的 failed()方法。

根据我的收集, HttpCore NIO 中有一个修复HTTPCORE-370,解决了4.3.2中的类似问题。我使用以下版本 - 公地httpclient的-3.1.jar httpasyncclient-4.1.1.jar 的HttpCore-4.4.4.jar 的HttpCore-NIO-4.4.4.jar

然而看到这个问题。 任何帮助将非常感激。

4 个答案:

答案 0 :(得分:3)

我在我的申请中一直处理同样的异常,我终于从这篇文章中找到了一个有用的建议 - 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()

原来我在自己的代码中做了一件非常愚蠢的事情。但在我阅读审计日志之前,我无法弄明白。

答案 1 :(得分:1)

就我而言,使用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) {

                });

答案 2 :(得分:0)

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

-XX:MaxDirectMemorySize=512M

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

答案 3 :(得分:0)

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

下面是我们的代码片段,其中更强大的客户端构建器尝试添加异常处理程序。请注意,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 以获得更多曝光。