httpclient - PoolingHttpClientConnectionManager 连接池监控
一般的, httpClient 在使用了连接池后,自身会处理空闲连接的回收,不过是在下一次请求获取连接的时候,才会释放之前已经过期的连接,这里我们可以采用启动一个线程来 连接池中连接的信息
IdleConnectionMonitorThread
public class IdleConnectionMonitorThread extends Thread {
private final HttpClientConnectionManager connMgr;
private volatile boolean shutdown;
public IdleConnectionMonitorThread(PoolingHttpClientConnectionManager connMgr) {
super();
this.connMgr = connMgr;
}
@Override
public void run() {
LogUtils.getLog().info(Thread.currentThread().getName() + ": monitor start...");
try {
while (!shutdown) {
synchronized (this) {
wait(3000);
// connMgr.closeExpiredConnections();d
// connMgr.closeIdleConnections(30, TimeUnit.SECONDS);
PoolStats totalStats = ((PoolingHttpClientConnectionManager) connMgr).getTotalStats();
LogUtils.getLog().info("pool stat: " + totalStats);
}
}
} catch (InterruptedException ex) {
shutdown();
}
}
public void shutdown() {
shutdown = true;
synchronized (this) {
notifyAll();
}
}
}
这样就可以了,你也可以主动回收过期连接,直接打开注释 的代码即可
pool stat: [leased: 2; pending: 0; available: 0; max: 2]
pool stat: [leased: 0; pending: 0; available: 2; max: 2]
pool stat: [leased: 0; pending: 0; available: 2; max: 2]
pool stat: [leased: 0; pending: 0; available: 2; max: 2]
pool stat: [leased: 0; pending: 0; available: 2; max: 2]
pool stat: [leased: 0; pending: 0; available: 2; max: 2]
pool stat: [leased: 0; pending: 0; available: 2; max: 2]
pool stat: [leased: 2; pending: 8; available: 0; max: 2]
pool stat: [leased: 2; pending: 8; available: 0; max: 2]
pool stat: [leased: 2; pending: 8; available: 0; max: 2]
pool stat: [leased: 2; pending: 6; available: 0; max: 2]
pool stat: [leased: 2; pending: 4; available: 0; max: 2]
pool stat: [leased: 2; pending: 2; available: 0; max: 2]
pool stat: [leased: 2; pending: 0; available: 0; max: 2]
pool stat: [leased: 0; pending: 0; available: 2; max: 2]
pool stat: [leased: 0; pending: 0; available: 2; max: 2]
pool stat: [leased: 0; pending: 0; available: 2; max: 2]