![](/img/trans.png)
[英]PoolingHttpClientConnectionManager does not release connections
[英]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實例。
然后我覆蓋來自PoolingHttpClientConnectionManager的requestConnection並將返回的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.