Apache http-client I/O 反应器错误

编辑

Apache http-client I/O 反应器错误

编辑

发送请求有时可能会失败,并出现以下来自 Apache http-client 库的错误之一:

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

I/O 反应器是 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
);