web-dev-qa-db-ja.com

Apache PoolingHttpClientConnectionManagerが不正な状態の例外をスローする

ここに私がそれを使用する方法があります-

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 {
            try {
                httpClient.close();
            } catch (IOException e) {
                LOGGER.error(e.getMessage());   
            }
        }

ここに私のスタックトレースがあります-

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エンドポイントを監視するジョブをスケジュールしています。接続プールの構成は次のとおりです。

totalMaxHttpConn=200
maxHttpConnPerRoute=20

Maven依存性..アーティファクトバージョン

httpclient 4.3.1
httpcore 4.3.1

[〜#〜] edit [〜#〜]-最後のブロックでCloseableHttpClientを閉じないことで問題は解決しました。 クライアントを閉じると接続プールがシャットダウンされるのはなぜですか?

上記のcloseablehttpclientは、単一のconnではなくプールへのハンドルです

17
abipc

この動作は、HC 4.3のバグが原因です。 HC 4.4a1で既に修正されています。 4.4の時点でCloseableHttpClient#closeは、クライアントが排他的に所有している場合にのみ、接続プールを自動的にシャットダウンする必要があります

10
ok2c

バージョン4.4では、メソッドsetConnectionManagerSharedがHttpClientBuilderに追加されました。 trueに設定すると、クライアントは接続マネージャーを閉じません。

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