2017-02-16 27 views
1

У меня проблема с HttpAsyncRequestExecutor.Elasticearch Rest Client - ConnectionClosedException при вызове executeRequestAsync

Я использую 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))? Если да, то какой вклад это?

Благодаря

UPDATE:

Я подозреваю, что проблема связана с Tomcat-х HttpClient, потому что этот код работает правильно в тесте интеграции (то есть возвращает результаты) ... Но это не работать (получить то же самое ConnectionClosedException), когда я делаю запрос REST через развернутый «интерфейс» tomcat

Любые огни на этом?

ответ

2

Проблема была в порту, было неправильно. Для запросов REST порт должен быть 9200 (а не 9300, как он был настроен). More info on elasticsearch ports.

Я хочу, чтобы elasticsearch мог сделать более явный журнал ошибок или подсказку вроде «вы подключаетесь к правильному порту?» когда вы пытаетесь получить доступ к порту 9300 с помощью чего-либо, кроме встроенных клиентов.