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 时,它可能会终止,例如 OutOfMemoryErrorStackOverflowError。请记住,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
);