簡體   English   中英

使用 PoolingHttpClientConnectionManager 獲取重用連接的統計信息

[英]Get stats of reused connections with PoolingHttpClientConnectionManager

如何從 PoolingHttpClientConnectionManager中獲取重用連接的數量?

它包含返回 PoolStats 的 getTotalStats() 方法,但不存在有關重用連接數量的信息。

PoolingHttpClientConnectionManager 有一個 CPool 的私有實例,它從 httpcomponents-core 擴展 AbstractConnPool。 當重用連接時,getPoolEntryBlocking 方法調用可用於此目的的 onReuse(entry) 方法。

我看不到獲取此信息用於監控目的的方法。 有沒有人看到另一種選擇?

如果您擴展標准池連接管理器或對其進行裝飾,它應該為您提供一個入口點,用於收集所需的連接重用詳細信息

public class MyPoolingHttpClientConnectionManager extends PoolingHttpClientConnectionManager {

    final AtomicLong reusedCount = new AtomicLong();

    @Override
    protected HttpClientConnection leaseConnection(
            Future<CPoolEntry> future,
            long timeout,
            TimeUnit timeUnit) throws InterruptedException, ExecutionException, ConnectionPoolTimeoutException {
        HttpClientConnection conn = super.leaseConnection(future, timeout, timeUnit);
        if (conn.isOpen()) {
            reusedCount.incrementAndGet();
        }
        return conn;
    }

}

解決方案是繼承ConnectionRequest並重寫get方法以將執行委托給構造函數上接收到的ConnectionRequest實例。

然后我覆蓋來自PoolingHttpClientConnectionManagerrequestConnection並將返回的ConnectionRequest與創建的子類一起包裝。

如果連接打開,我會增加重用連接的統計信息。 否則,我會增加已創建連接的統計信息。

public class MonitoredPoolingHttpClientConnectionManager extends PoolingHttpClientConnectionManager

    private final AtomicInteger createdConnections = new AtomicInteger();
    private final AtomicInteger reusedConnections = new AtomicInteger();

    @Override
    public ConnectionRequest requestConnection(HttpRoute route, Object state) {
        ConnectionRequest requestConnection = super.requestConnection(route, state);
        return new MonitoredConnectionRequest(requestConnection);
    }
    
    private class MonitoredConnectionRequest implements ConnectionRequest {

        private ConnectionRequest wrapped;

        public MonitoredConnectionRequest(ConnectionRequest requestConnection) {
            this.wrapped = requestConnection;
        }

        @Override
        public boolean cancel() {
            return wrapped.cancel();
        }

        @Override
        public HttpClientConnection get(long timeout, TimeUnit timeUnit) throws InterruptedException, ExecutionException, ConnectionPoolTimeoutException {
            HttpClientConnection conn = wrapped.get(timeout, timeUnit);
            if (conn.isOpen()) {
                reusedConnections.incrementAndGet();
            } else {
                createdConnections.incrementAndGet();
            }
            return conn;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM