2017-02-16 1 views
1

J'ai un problème avec HttpAsyncRequestExecutor.Elasticsearch Rest Client - ConnectionClosedException lors de l'appel de performRequestAsync

J'utilise elasticsearch Java Rest Client et je suis toujours obtenir un ConnectionClosedException (voir ci-dessous) quand je l'appelle 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(); 
         } 
        }); 
     } 
    } 

Exception ici:

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) 

Je ne sais pas ce que est la vraie cause de la fermeture de la connexion. La même requête fonctionne bien dans kopf et renvoie des résultats de recherche valides. De plus, je n'appelle aucun restClient.close() ou quoi que ce soit de similaire.

Des idées où le problème pourrait être? La fin de l'entrée est-elle la cause d'un état de connexion fermé (selon org.apache.http.nio.protocol.HttpAsyncRequestExecutor.endOfInput(conn))? Si oui, quelle est la contribution?

Merci

MISE À JOUR:

Je soupçonne que le problème est lié à Tomcat de HttpClient, parce que ce code fonctionne correctement dans un test d'intégration (qui est, renvoie les résultats) ... mais il n'a pas travailler (obtenir le même ConnectionClosedException) lorsque je fais une demande REST à travers une "interface" déployée par tomcat

Des lumières sur ce?

Répondre

2

Le problème était que le port était mauvais. Pour les demandes REST, le port doit être 9200 (et non 9300 comme il a été configuré). Je souhaite que elasticsearch puisse faire un journal d'erreurs plus explicite ou un indice comme "vous connectez-vous avec le bon port?" pour quand on essaie d'accéder au port 9300 avec autre chose que les clients intégrés.