閱讀649 返回首頁    go 技術社區[雲棲]


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

 轉載自 並發編程網 - ifeve.com

最後更新:2017-05-19 12:31:11

  上一篇:go  《雲數據管理:挑戰與機遇》2.1.3 互斥和仲裁集
  下一篇:go  帶著問題學 Spring MVC 源碼: 一、概述