Apache http-客户端I/O反应器错误

编辑

Apache http-客户端I/O反应器错误

编辑

发送请求有时会失败,并出现以下错误,这些错误来自Apache http-客户端库

  • 无法执行请求;I/O反应器状态:已停止
  • I/O反应器异常终止
  • I/O反应器已关闭

I/O反应器是http客户端库中的内部事件循环。当应用程序回调抛出Error(例如OutOfMemoryErrorStackOverflowError)时,它可能会终止。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
);