7
votes

Multi-threading httpclient

Exception in thread "pool-1-thread-1" java.lang.IllegalStateException: Invalid use of SingleClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
    at org.apache.http.impl.conn.SingleClientConnManager.getConnection(SingleClientConnManager.java:216)
    at org.apache.http.impl.conn.SingleClientConnManager$1.getConnection(SingleClientConnManager.java:190)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    at MyTask.execHttpRequest(test.java:72)
    at MyTask.run(test.java:60)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
java.io.InterruptedIOException: Connection has been shut down
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:543)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    at MyTask.execHttpRequest(test.java:72)
    at MyTask.run(test.java:60)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: org.apache.http.impl.conn.ConnectionShutdownException
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.assertValid(AbstractPooledConnAdapter.java:86)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.getRoute(AbstractPooledConnAdapter.java:112)
    at org.apache.http.impl.client.DefaultRequestDirector.establishRoute(DefaultRequestDirector.java:740)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:577)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
    ... 8 more

0 commentaires

4 Réponses :


7
votes

Vous avez besoin de définir de la définition multi-threads HTTPConnectionManager, par exemple xxx

pour plus de détails, vous pouvez voir http://hc.apache.org/httpclient-3.x/threading.html


0 commentaires

3
votes

J'ai réalisé ma folie! httpClient et httpRequest étaient les deux statiques. Après que je les ai fait non statique, cela fonctionne bien! Le service exécuteur me donne un meilleur contrôle sur la gestion des threads et je tiens à l'utiliser.


0 commentaires

8
votes

est venu ici pour dire, MultithreadedhttpConnectionManager n'est pas à jour. Actuellement (httpClient version 4. *) C'est la voie: http://hc.apache.org/httpcomponents-Client-ga/Tutorial/html/connmgmt.html#d5e639 XXX


0 commentaires

1
votes

En plus de BPGERGO RÉPONSE - Le gestionnaire de connexion a encore mis à jour à nouveau (à la version httpclient> = 4.3), et maintenant, vous devez utiliser PoolingHttpClientConnectionManager code>. Les limitations par défaut du PoolingHttTPClientConnectionManager code> sont au total 20 connexions et 2 par route - mais celles-ci peuvent être remplacées.

PoolingHttpClientConnectionManager cm=new PoolingHttpClientConnectionManager();
cm.setDefaultMaxPerRoute(40);
cm.setMaxTotal(500);
CloseableHttpClient client = HttpClients.createMinimal(cm);


0 commentaires