java.lang.IllegalStateException: Request 無法執行;I/O 反应器状态:已停止

我有一个服务,预计以~5或更多的请求/分钟执行请求。此服务依赖于 Apache AsyncHttpClient。每隔几分钟后,客户端就会遇到一些导致java.lang.IllegalStateException的情况:请求无法执行;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

然而,看到这个问题。


答案 1

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

事实证明,我在自己的代码中做了一些非常愚蠢的事情。但是直到我阅读审核日志,我才弄清楚。


答案 2

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

-XX:MaxDirectMemorySize=512M

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


推荐