java connection-pooling apache-httpclient-4.x

java - Apache PoolingHttpClientConnectionManager lanzando una excepción de estado ilegal



connection-pooling apache-httpclient-4.x (2)

Así es como lo uso.

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();

También he puesto un bloque final alrededor de GET http -

finally { try { httpClient.close(); } catch (IOException e) { LOGGER.error(e.getMessage()); } }

Aquí está mi 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)

Estoy utilizando Quartz para programar un trabajo de monitoreo de puntos finales de HTTP. Aquí está la configuración de mi grupo de conexión

totalMaxHttpConn=200 maxHttpConnPerRoute=20

Dependencia de Maven .. Versión artefacto.

httpclient 4.3.1 httpcore 4.3.1

EDITAR - Bueno, el problema se escapó al no cerrar CloseableHttpClient en el bloque final. ¿Alguien puede decir por qué se comporta de esa manera? ¿Por qué se cierra el conjunto de conexiones si cierro un cliente?

Es el closeablehttpclient anterior es un identificador para el grupo en lugar de una sola conexión


En la versión 4.4, el método setConnectionManagerShared se agregó a HttpClientBuilder. Si lo configura en verdadero, el cliente no cerrará el administrador de conexión.

HttpClients.custom() .setConnectionManager(Util.getConnectionManager()) // shared connection manager .setConnectionManagerShared(true)


Este comportamiento se debe a un error en HC 4.3. Ya se ha corregido en HC 4.4a1. A partir del 4.4 CloseableHttpClient#close debería cerrar automáticamente el grupo de conexiones solo si es propiedad exclusiva del cliente