我有一个服务,预计会以~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
然而看到这个问题。 任何帮助将非常感激。
答案 0 :(得分:3)
我在我的申请中一直处理同样的异常,我终于从这篇文章中找到了一个有用的建议 - http://httpcomponents.10934.n7.nabble.com/I-O-reactor-status-STOPPED-td29059.html
您可以使用I / O反应器的#getAuditLog()方法来准确找出 什么异常导致它终止。
如果您保留对ConnectionManager的IOReactor的引用,您可以调用此方法来深入了解实际问题:
原来我在自己的代码中做了一件非常愚蠢的事情。但在我阅读审计日志之前,我无法弄明白。
答案 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
答案 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 以获得更多曝光。