1. 程式人生 > >《HttpClient官方文件》2.5 連線驅逐策略

《HttpClient官方文件》2.5 連線驅逐策略

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();
        }
    }
    
}