Voici comment je l'utilise -
private static final PoolingHttpClientConnectionManager connPool;
static {
connPool = new PoolingHttpClientConnectionManager();
// Increase max total connection to 200
connPool.setMaxTotal(200);//configurable through app.properties
// Increase default max connection per route to 50
connPool.setDefaultMaxPerRoute(20);//configurable through app.properties
}
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connPool) .build();
J'ai aussi mis un bloc enfin autour de http GET -
finally {
try {
httpClient.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
Voici ma stacktrace -
Java.lang.IllegalStateException: Connection pool shut down
at org.Apache.http.util.Asserts.check(Asserts.Java:34)
at org.Apache.http.pool.AbstractConnPool.lease(AbstractConnPool.Java:169)
at org.Apache.http.impl.conn.PoolingHttpClientConnectionManager.requestConnection(PoolingHttpClientConnectionManager.Java:217)
at org.Apache.http.impl.execchain.MainClientExec.execute(MainClientExec.Java:157)
at org.Apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.Java:194)
at org.Apache.http.impl.execchain.RetryExec.execute(RetryExec.Java:85)
at org.Apache.http.impl.execchain.RedirectExec.execute(RedirectExec.Java:108)
at org.Apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.Java:186)
at org.Apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.Java:82)
at org.Apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.Java:106)
at com.A.B.C.CustomHttpClient.doGETAndValidate(CustomHttpClient.Java:44)
at com.A.B.C.SiteMonitorTask.monitorAndUpdateEndPoints(SiteMonitorTask.Java:48)
at com.A.B.C.SiteMonitorTask.run(SiteMonitorTask.Java:37)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
at Java.lang.Thread.run(Thread.Java:744)
J'utilise Quartz pour planifier un travail de surveillance des points de terminaison Http. Voici ma configuration de pool de connexions
totalMaxHttpConn=200
maxHttpConnPerRoute=20
Dépendance Maven .. version d'artefact
httpclient 4.3.1
httpcore 4.3.1
EDIT - Eh bien, le problème a disparu en ne fermant pas CloseableHttpClient dans le bloc enfin. Quelqu'un peut-il dire pourquoi cela se comporte comme ça? Pourquoi le pool de connexions est-il fermé si je ferme un client?
Est-ce que le client fermable ci-dessus est un handle vers la piscine plutôt qu'un seul conn)
Ce comportement est dû à un bogue dans HC 4.3. Il a déjà été corrigé dans HC 4.4a1. À partir du 4.4 CloseableHttpClient#close
ne doit fermer automatiquement le pool de connexions que s'il appartient exclusivement au client
Dans la version 4.4, la méthode setConnectionManagerShared a été ajoutée à HttpClientBuilder. Si vous le définissez sur true, le client ne fermera pas le gestionnaire de connexions.
HttpClients.custom()
.setConnectionManager(Util.getConnectionManager()) // shared connection manager
.setConnectionManagerShared(true)