Elasticsearch Rest Client - 调用performRequestAsync时的ConnectionClosedException

时间:2017-02-16 15:05:48

标签: java apache http elasticsearch nio

我在HttpAsyncRequestExecutor上遇到了问题。

我正在使用elasticsearch Java Rest Client,当我致电ConnectionClosedException时,我总是收到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();
                        }
                    });
        }
    }

此处有例外:

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)

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

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

由于

更新

我怀疑问题与Tomcat的HttpClient有关,因为此代码在集成测试中正常工作(即返回结果)......但它不起作用(得到相同的{ {1}})当我通过tomcat部署&#34;接口&#34;发出REST请求时

这有什么亮点吗?

1 个答案:

答案 0 :(得分:2)

问题是端口错了。对于REST请求,端口应为9200(而不是像配置的那样9300)。 More info on elasticsearch ports.

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