Apache http-客户端I/O反应器错误
编辑Apache http-客户端I/O反应器错误
编辑发送请求有时会失败,并出现以下错误,这些错误来自Apache http-客户端库
-
无法执行请求;I/O反应器状态:已停止
-
I/O反应器异常终止
-
I/O反应器已关闭
I/O反应器是http客户端库中的内部事件循环。当应用程序回调抛出Error
(例如OutOfMemoryError
或StackOverflowError
)时,它可能会终止。Error
与普通的Exception
不同,并且——引用Java文档——表示严重的错误,合理的应用程序不应尝试捕获这些错误。
在Elasticsearch Java客户端的上下文中,这可能发生在两种情况下:
- 应用程序直接调用低级
RestClient
,使用异步performRequestAsync
方法,并且在应用程序提供的ResponseListener
中抛出Error
。 - 缓冲http响应正文时发生
OutOfMemoryError
。
在第一种情况下,应用程序有责任在其ResponseListener
中捕获Error
,并在发生这些错误时决定采取什么措施。
从8.12版本开始,Java API客户端已经处理了第二种情况:该错误被包装在一个RuntimeException
中,并报告给应用程序。
在早期版本的Java API客户端中,您可以将SafeResponseConsumer
类复制粘贴到您的项目中,并按如下方式初始化RestClientTransport
:
RestClient restClient = ... JsonpMapper mapper = ... RestClientOptions options = new RestClientOptions( SafeResponseConsumer.DEFAULT_REQUEST_OPTIONS ); RestClientTransport transport = new RestClientTransport( restClient, mapper, options );