Apache PoolingHttpClientConnectionManager 抛出非法状态异常 [英] Apache PoolingHttpClientConnectionManager throwing illegal state exception

查看:56
本文介绍了Apache PoolingHttpClientConnectionManager 抛出非法状态异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我如何使用它 -

Here is how I use it -

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

我还在 http GET 周围放置了一个 finally 块 -

ALso I have put a finally block around http GET -

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

这是我的堆栈跟踪 -

Here is my 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)

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

I am using Quartz to schedule a job of monitoring Http end points.. Here is my connection pool configuration

totalMaxHttpConn=200
maxHttpConnPerRoute=20

Maven 依赖.. 工件版本

Maven dependency.. artifact version

httpclient 4.3.1
httpcore 4.3.1

EDIT - 好吧,问题没有在 finally 块中关闭 CloseableHttpClient 就解决了.. 谁能告诉它为什么会这样?如果我关闭客户端,为什么连接池会关闭?

EDIT - Well the problem got away by not closing CloseableHttpClient in the finally block.. Can anyone tell why is it behaving like that? Why is connection pool shut down if i close a client?

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

推荐答案

此行为是由于 HC 4.3 中的错误所致.它已在 HC 4.4a1 中修复.从 4.4 开始,CloseableHttpClient#close 应该仅在客户端独占时自动关闭连接池

This behavior is due to a bug in HC 4.3. It has already been fixed in HC 4.4a1. As of 4.4 CloseableHttpClient#close should automatically shut down the connection pool only if exclusively owned by the client

这篇关于Apache PoolingHttpClientConnectionManager 抛出非法状态异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆