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