沙师弟,师父的充电器掉了

IllegalStateException: I/O reactor has been shut down

Elasticsearch | 作者 talon | 发布于2019年11月19日 | 阅读数:7055

使用 bulk  批量插入数据到 es 集群时,如果关掉其中的一个节点,会出现后续的所有插入都报错:
 
[b]java.lang.IllegalStateException: I/O reactor has been shut down
[/b] 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:481)
at org.apache.http.nio.pool.AbstractNIOConnPool.lease(AbstractNIOConnPool.java:280)
at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.requestConnection(PoolingNHttpClientConnectionManager.java:295)
at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.requestConnection(AbstractClientExchangeHandler.java:377)
at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.start(DefaultClientExchangeHandlerImpl.java:129)
at org.apache.http.impl.nio.client.InternalHttpAsyncClient.execute(InternalHttpAsyncClient.java:141)
at org.elasticsearch.client.RestClient.performRequestAsync(RestClient.java:301)
at org.elasticsearch.client.RestClient.access$1000(RestClient.java:95)
at org.elasticsearch.client.RestClient$1.failed(RestClient.java:328)
at org.apache.http.concurrent.BasicFuture.failed(BasicFuture.java:134)

 
[b]java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STOPPED
[/b] 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:301)
at org.elasticsearch.client.RestClient.performRequestAsync(RestClient.java:291)
at org.elasticsearch.client.RestHighLevelClient.internalPerformRequestAsync(RestHighLevelClient.java:1567)
at org.elasticsearch.client.RestHighLevelClient.performRequestAsync(RestHighLevelClient.java:1530)
at org.elasticsearch.client.RestHighLevelClient.performRequestAsyncAndParseEntity(RestHighLevelClient.java:1498)
at org.elasticsearch.client.RestHighLevelClient.bulkAsync(RestHighLevelClient.java:488)

通过 debug 发现,是由于发生了异常导致 httpAsyncClient shutdown 导致的,但是不知道有什么方法阻止 client shutdown 操作,因为项目实时性要求较高,每次一批操作完后重新 build restClient 的操作性能会很低。
 

@Override
public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
if (failure != null) {
logger.error("错误描述: 写ES错误, exMsg: ", failure);
}
}

 
不知道各位老师有什么好的解决方案 。
已邀请:

Ombres

赞同来自: Merrizee

检查一下是不是你们把client close掉了,这个client是实现了Closeable接口的,一般来说只有client关闭才会出现这个异常

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

关闭的是什么类型的节点,
关闭前有没有停止分片自动分配呢

Merrizee

赞同来自:

我也出现这问题了,去掉关闭client就好了,但是执行批量增数据的时候,执行一会会出现堆外溢出的问题

Merrizee

赞同来自:

这个创建client对象工具类里的方法

要回复问题请先登录注册