Apache http-client I/O 反应器错误
编辑Apache http-client I/O 反应器错误
编辑发送请求有时可能会失败,并出现以下来自 Apache http-client 库的错误之一:
-
无法执行请求;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
,并决定发生这些错误时该如何处理。
第二种情况在 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 );