zl程序教程

您现在的位置是:首页 >  其他

当前栏目

《HttpClient官方文档》2.5 连接驱逐策略

2023-03-14 22:27:42 时间

2.5. 连接驱逐策略

经典阻塞I / O模型的主要缺点之一是网络套接字只有在I / O操作阻塞时才能对I / O事件作出反应。当连接释放回管理器时,它可以保持活动,但是它无法监视套接字的状态,并对任何I / O事件做出反应。如果服务器端关闭连接,客户端这边的连接将无法察觉连接状态的变化(并且在通过在末端关闭套接字来做出适当地对应)。

HttpClient通过测试连接是否为“stale”,希望能够缓解使用连接来执行HTTP请求之前,由于服务器端关闭了这个连接使得它不再有效的问题。对连接是否过时的检查不是 100%可靠的。用于闲置连接的不涉及每套接字一线程模型的唯一可行解决方案是用监视器线程来收回由于长时间不活动而被认为过期的连接。监视器线程可以定期调用ClientConnectionManager#closeExpiredConnections()方法关闭所有过期的连接并从连接池中驱逐已关闭的连接。它还可以调用ClientConnectionManager#closeIdleConnections()这个方法来关闭在给定时间段内所有闲置连接。

public static class IdleConnectionMonitorThread extends Thread {
    
    private final HttpClientConnectionManager connMgr;
    private volatile boolean shutdown;
    
    public IdleConnectionMonitorThread(HttpClientConnectionManager connMgr) {
        super();
        this.connMgr = connMgr;
    }

    @Override
    public void run() {
        try {
            while (!shutdown) {
                synchronized (this) {
                    wait(5000);
                    // Close expired connections
                    connMgr.closeExpiredConnections();
                    // Optionally, close connections
                    // that have been idle longer than 30 sec
                    connMgr.closeIdleConnections(30, TimeUnit.SECONDS);
                }
            }
        } catch (InterruptedException ex) {
            // terminate
        }
    }
    
    public void shutdown() {
        shutdown = true;
        synchronized (this) {
            notifyAll();
        }
    }
    
}

 转载自 并发编程网 - ifeve.com