java - 突然出现此错误 java.lang.IllegalStateException: Request cannot be executed; I/O 反应器状态:已停止
问题描述
我正在使用 httpcore-nio-4.4.5.jar。我正在使用 elasticsearch RestHighLevelClient 与我们的 elasticsearch 服务器进行交互。这一切都很好,除了有一段时间我们突然出现 I/O 反应器停止错误。
在 ES 方面一切似乎都很好。没有奇怪的行为。
这就是我初始化我的 ES 客户端的方式。
public synchronized RestHighLevelClient getHighLevelClient() throws ManagerException {
if (highLevelClient != null) {
return highLevelClient;
}
Map<String, Integer> map = getEsServers(esAddresses);
HttpHost[] hosts = new HttpHost[map.size()];
int i = 0;
for (Map.Entry<String, Integer> entry : map.entrySet()) {
hosts[i++] = new HttpHost(entry.getKey(), entry.getValue(), "http");
LOGGER.info(entry.getKey() + " " + entry.getValue());
}
RestClientBuilder restClientBuilder = RestClient.builder(hosts);
highLevelClient = customizeHttpClient(restClientBuilder);
return highLevelClient;
}
public RestHighLevelClient customizeHttpClient(RestClientBuilder restClientBuilder) {
Header[] defaultHeaders = new Header[2];
defaultHeaders[0] = new BasicHeader("Authorization", "Basic YTph");
defaultHeaders[1] = new BasicHeader("Accept", "application/json");
restClientBuilder.setDefaultHeaders(defaultHeaders);
restClientBuilder.setMaxRetryTimeoutMillis(MAX_RETRY_TIMEOUT_MILLIS);
restClientBuilder.setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder
.setConnectTimeout(CONNECT_TIMEOUT_MILLIS)
.setSocketTimeout(SOCKET_TIMEOUT_MILLIS)
.setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT_MILLIS));
restClientBuilder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
.setMaxConnPerRoute(MAX_CONN_PER_ROUTE)
.setMaxConnTotal(MAX_CONN_TOTAL));
return new RestHighLevelClient(restClientBuilder);
}
所以基本上首先我得到以下堆栈跟踪
java.lang.IllegalStateException: I/O reactor has been shut down
at org.apache.http.util.Asserts.check(Asserts.java:34)
at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.connect(DefaultConnectingIOReactor.java:224)
at org.apache.http.nio.pool.AbstractNIOConnPool.processPendingRequest(AbstractNIOConnPool.java:434)
at org.apache.http.nio.pool.AbstractNIOConnPool.lease(AbstractNIOConnPool.java:276)
at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.requestConnection(PoolingNHttpClientConnectionManager.java:266)
at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.requestConnection(AbstractClientExchangeHandler.java:363)
at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.start(DefaultClientExchangeHandlerImpl.java:125)
at org.apache.http.impl.nio.client.InternalHttpAsyncClient.execute(InternalHttpAsyncClient.java:141)
at org.elasticsearch.client.RestClient.performRequestAsync(RestClient.java:346)
at org.elasticsearch.client.RestClient.performRequestAsync(RestClient.java:328)
at org.elasticsearch.client.RestClient.performRequestAsync(RestClient.java:271)
at org.elasticsearch.client.RestHighLevelClient.performRequestAsync(RestHighLevelClient.java:537)
at org.elasticsearch.client.RestHighLevelClient.performRequestAsyncAndParseEntity(RestHighLevelClient.java:515)
at org.elasticsearch.client.RestHighLevelClient.searchAsync(RestHighLevelClient.java:400)
之后没有超时,只有以下异常持续,直到我重新启动我的服务器。
java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STOPPED
at org.apache.http.util.Asserts.check(Asserts.java:46)
at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase.ensureRunning(CloseableHttpAsyncClientBase.java:90)
at org.apache.http.impl.nio.client.InternalHttpAsyncClient.execute(InternalHttpAsyncClient.java:123)
at org.elasticsearch.client.RestClient.performRequestAsync(RestClient.java:346)
at org.elasticsearch.client.RestClient.performRequestAsync(RestClient.java:328)
at org.elasticsearch.client.RestClient.performRequestAsync(RestClient.java:271)
at org.elasticsearch.client.RestHighLevelClient.performRequestAsync(RestHighLevelClient.java:537)
at org.elasticsearch.client.RestHighLevelClient.performRequestAsyncAndParseEntity(RestHighLevelClient.java:515)
at org.elasticsearch.client.RestHighLevelClient.searchAsync(RestHighLevelClient.java:400) ```
解决方案
我遇到了同样的问题,结果我没有关闭 HighLevelRestClient。
请参阅https://discuss.elastic.co/t/request-cannot-be-executed-io-reactor-status-stopped/195438/4上的 HenningAndersen 回答:
这听起来类似于https://github.com/elastic/elasticsearch/issues/45115 141。该问题中的问题是由在客户端应用程序代码中的 onFailure 方法中引发异常引起的。这会导致连接关闭,后续请求将失败并报告此处的错误。
我相信,如果使用任何通过 ActionListener 报告响应/失败的方法(我认为它们的方法名称中都有后缀 Async),我相信这也会影响高级客户端。
解决方法是确保不会从您的onFailure方法中抛出异常。
推荐阅读
- node.js - 从节点js中的回调url中提取值
- vba - VBA 中是否有与 WSC32.DLL 库类似的处理串行通信的本机函数?
- node.js - 从类重构为函数组件后,React 获取的对象无法正常工作
- r - R:查找并汇总数百万条记录,然后找到最好的一条
- python - AttributeError:模块“mediapipe.python.solutions.holistic”没有属性“FACE_CONNECTIONS”
- css - 为什么设置背景颜色时我的图像平铺 css
- postgresql - 如何根据另一个表中的值进行更新插入?
- api - 如何放心地发送文件上传多部分表单
- css - 当我使用 tailwindcss 时,扩展运算符不起作用
- electron - 网络离线时如何检测electron.BrowserWindow中的白屏