Elasticsearch Rest Client - 调用 performRequestAsync 时的 ConnectionClosedException

Jon*_*nyD 3 java apache nio http elasticsearch

我在 HttpAsyncRequestExecutor 上遇到了问题。

我正在使用elasticsearch Java Rest ClientConnectionClosedException当我调用时总是得到一个(见下文)performRequestAsync

    // variables (all with valid format):
    // endpoint is just a List<String> with "14655/_search"

    // params is just a Map<String, String> with
    //   "pretty", "true"
    //   "search_type", "query_then_fetch"

    // entity is just a HttpEntity entity with the Json body request

    final int numRequests = endpoints.size();
    final CountDownLatch latch = new CountDownLatch(numRequests);
    try (Timer.Context ctx = this.requestTimer.time()) {
        for (final String endpoint : endpoints) {
            // ERROR hapens here:
            restClient.performRequestAsync("GET", endpoint, params, entity,
                    new ResponseListener() {

                        @Override
                        public void onSuccess(final Response response) {
                            if (response != null) {
                                responses.add(response);
                                latch.countDown();
                            }
                        }

                        @Override
                        public void onFailure(final Exception exception) {
                            latch.countDown();

                            logger.error("could not get search results for....",exception);
                            exception.printStackTrace();
                        }
                    });
        }
    }
Run Code Online (Sandbox Code Playgroud)

这里的例外:

org.apache.http.ConnectionClosedException: Connection closed
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.endOfInput(HttpAsyncRequestExecutor.java:341)
at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:263)
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:116)
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:164)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:339)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:317)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:278)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:106)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:590)
at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)

我不知道连接关闭的真正原因是什么。完全相同的请求在kopf 中运行良好并返回有效的搜索结果。另外,我不会打电话给任何restClient.close()或类似的东西。

问题可能出在哪里的任何想法?输入的结束是否是导致关闭连接状态的原因(根据org.apache.http.nio.protocol.HttpAsyncRequestExecutor.endOfInput(conn))?如果是,那是什么输入?

谢谢

更新:

我怀疑问题是关系到Tomcat的HttpClient,因为这段代码工作正常在集成测试(即返回结果)...但它不工作(得到相同的ConnectionClosedException),当我通过做一个Tomcat部署REST请求“界面”

有这方面的灯​​吗?

Jon*_*nyD 6

问题是端口错误。对于 REST 请求,端口应该是 9200(而不是像配置的 9300)。有关 elasticsearch 端口的更多信息。

我希望 elasticsearch 可以制作更明确的错误日志或提示,例如“您是否使用正确的端口连接?” 当人们尝试使用内置客户端以外的任何东西访问 9300 端口时。