Apache PoolingHttpClientConnectionManager抛出非法状态异常

abi*_*ipc 18 java connection-pooling apache-httpclient-4.x

这是我如何使用它 -

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();
Run Code Online (Sandbox Code Playgroud)

另外我在http GET周围放了一个finally块 -

finally {
            try {
                httpClient.close();
            } catch (IOException e) {
                LOGGER.error(e.getMessage());   
            }
        }
Run Code Online (Sandbox Code Playgroud)

这是我的堆栈跟踪 -

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)
Run Code Online (Sandbox Code Playgroud)

我正在使用Quartz来安排监控Http端点的工作.这是我的连接池配置

totalMaxHttpConn=200
maxHttpConnPerRoute=20
Run Code Online (Sandbox Code Playgroud)

Maven依赖..神器版本

httpclient 4.3.1
httpcore 4.3.1
Run Code Online (Sandbox Code Playgroud)

编辑 - 好吧,通过不关闭finally块中的CloseableHttpClient来解决问题..任何人都可以告诉它为什么会这样?如果我关闭客户端,为什么连接池会关闭?

上面的closeablehttpclient是池的句柄而不是单个conn

Rob*_*erg 38

在4.4版中,方法setConnectionManagerShared被添加到HttpClientBuilder中.如果将其设置为true,则客户端将不会关闭连接管理器.

HttpClients.custom()
            .setConnectionManager(Util.getConnectionManager()) // shared connection manager
            .setConnectionManagerShared(true)
Run Code Online (Sandbox Code Playgroud)


ok2*_*k2c 10

此行为是由于HC 4.3中的错误.它已在HC 4.4a1中修复.从4.4开始,CloseableHttpClient#close只有在客户独占时才会自动关闭连接池

  • 我正在使用由`PoolingHttpClientConnectionManager` 支持的 Jersey2.6。会不会有同样的问题? (2认同)