74 votes

HttpClient 4.0.1 - comment libérer la connexion?

J'ai une boucle sur un tas d'Url, pour chacun, je suis en train de faire le suivant:

private String doQuery(String url) {

  HttpGet httpGet = new HttpGet(url);
  setDefaultHeaders(httpGet); // static method
  HttpResponse response = httpClient.execute(httpGet);   // httpClient instantiated in constructor

  int rc = response.getStatusLine().getStatusCode();

  if (rc != 200) {
    // some stuff...
    return;
  }

  HttpEntity entity = response.getEntity();

  if (entity == null) {
    // some stuff...
    return;
  }

  // process the entity, get input stream etc

}

La première requête est bien, la deuxième lève cette exception:

Exception in thread "main" java.lang.IllegalStateException: Utilisation invalide de SingleClientConnManager: connexion encore attribués. Assurez-vous de la libération la connexion avant l'affectation un autre. au org.apache.http.impl.conn.SingleClientConnManager.getConnection(SingleClientConnManager.java:199) au org.apache.http.impl.conn.SingleClientConnManager$1.getConnection(SingleClientConnManager.java:173)......

C'est juste une simple single-threaded app. Comment puis-je publier cette connexion?

97voto

Yadu Points 919

Httpcomponents 4.1 recommande de fermer la connexion et de libérer toutes les ressources sous-jacentes:

 EntityUtils.consume(HttpEntity)
 

HttpEntity passé est une entité de réponse.

33voto

Snicolas Points 19644

Cela semble bien fonctionner:

       if( response.getEntity() != null ) {
         response.getEntity().consumeContent();
      }//if
 

Et n'oubliez pas de consommer l'entité même si vous n'avez pas ouvert son contenu. Par exemple, vous attendez un statut HTTP_OK de la réponse et vous ne l'obtenez pas, vous devez toujours utiliser l'entité!

23voto

Richard H Points 11693

Pour répondre à ma propre question: pour libérer la connexion (et toutes les autres ressources associées à la demande), vous devez fermer le flux InputStream renvoyé par HttpEntity:

 InputStream is = entity.getContent();

.... process the input stream ....

is.close();       // releases all resources
 

De la docs

19voto

wikier Points 591

Depuis la version 4.2, ils ont introduit une méthode beaucoup plus pratique qui simplifie la libération de la connexion: HttpRequestBase.releaseConnection ()

7voto

Jignesh Points 644

Si la réponse ne doit pas être consommée, la demande peut être annulée à l'aide du code ci-dessous:

         // Low level resources should be released before initiating a new request
        HttpEntity entity = response.getEntity();

        if (entity != null) {
            // Do not need the rest
            httpPost.abort();
        }
 

Référence: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e143

 Apache HttpClient Version: 4.1.3
 

Merci,

Jignesh

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X