elasticsearch,Java,Multithreading,elasticsearch" /> elasticsearch,Java,Multithreading,elasticsearch" />

Java 跨不同索引的弹性搜索在多线程场景中失败

Java 跨不同索引的弹性搜索在多线程场景中失败,java,multithreading,elasticsearch,Java,Multithreading,elasticsearch,我有一个用例,我需要从5个不同的索引中提取数据,然后合并结果。连续地这样做需要花费很多时间 我想并行运行弹性搜索,然后合并结果。 我正在使用ExecutorService,它生成5个不同的线程,并跨不同的索引触发弹性查询 我把RestHighLevelClient作为一个单身汉 我得到以下错误:- org.apache.http.ConnectionClosedException: Connection closed unexpectedly at org.apache.http.nio.pro

我有一个用例,我需要从5个不同的索引中提取数据,然后合并结果。连续地这样做需要花费很多时间

我想并行运行弹性搜索,然后合并结果。 我正在使用ExecutorService,它生成5个不同的线程,并跨不同的索引触发弹性查询

我把RestHighLevelClient作为一个单身汉

我得到以下错误:-

org.apache.http.ConnectionClosedException: Connection closed unexpectedly
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.closed(HttpAsyncRequestExecutor.java:146)
at org.apache.http.impl.nio.client.InternalIODispatch.onClosed(InternalIODispatch.java:71)
at org.apache.http.impl.nio.client.InternalIODispatch.onClosed(InternalIODispatch.java:39)
at org.apache.http.impl.nio.reactor.AbstractIODispatch.disconnected(AbstractIODispatch.java:100)
at org.apache.http.impl.nio.reactor.BaseIOReactor.sessionClosed(BaseIOReactor.java:279)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processClosedSessions(AbstractIOReactor.java:440)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:283)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)
at java.lang.Thread.run(Thread.java:748)
***如果我为每个线程创建一个新的客户机,这似乎是可行的。但这是一个性能的打击

private void createESClient() {
    try {
        int socketTimeout = 30000;
        int connectTimeout = 10000;
        int maxRetryTimeout = 60000;

        lowLevelClient = RestClient.builder(new HttpHost(host))
                .setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder.setConnectTimeout(connectTimeout).setSocketTimeout(socketTimeout)).setMaxRetryTimeoutMillis(maxRetryTimeout).build();
        client = new RestHighLevelClient(lowLevelClient);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

如何在不创建多个客户机的情况下实现并行性?

请显示代码,其中您启动了几个使用相同实例的
RestHighLevelClient
的线程。ElasticSearch文档
umentation说
RestHighLevelClient`是线程安全的:
RestHighLevelClient是线程安全的。它通常是由应用程序在启动时或第一个请求执行时实例化的。
这更像是一个愚蠢的错误,我当时在做//DOIElasticSearchRestClient.close();在导致问题的每个工作线程中。问题现在已解决。请显示代码,说明您在何处启动多个线程,这些线程使用同一个
RestHighLevelClient
实例。ElasticSearch文档
umentation说
RestHighLevelClient`是线程安全的:
RestHighLevelClient是线程安全的。它通常是由应用程序在启动时或第一个请求执行时实例化的。
这更像是一个愚蠢的错误,我当时在做//DOIElasticSearchRestClient.close();在导致问题的每个工作线程中。现在问题解决了。