Apache HttpClient源碼分析之鏈接池

圖片描述

上圖時鏈接池類圖關係。
PoolingHttpConnectionManager:就是咱們一般所說的鏈接池
CPool:實際池化鏈接保持者
RouteSpecificPool:與Route關聯的鏈接池apache

說明:
CPool與RouteSpecificPool裏的鏈接均分爲三種–available, leased和pending,分別對應空閒,佔用和堵塞三種狀態,鏈接池爲這三種狀態創建三個列表(List/Set)。CPool對鏈接數的管理則有兩個維度,分別是全局最大數和單route最大數。CPool維護着route與RouteSpecificPool的關係。操做鏈接時,會先經過RouteSpecificPool進行操做,而後對CPool上進行操做。當PoolingHttpConnectionManager請求一個鏈接時,CPool會返回Future<PoolEntry>。而CPoolEntry會維護ManagedHttpClientConnection與HttpRoute及存活時間等。最終用戶獲得的是PoolingHttpConnectionManager裏封裝而成的鏈接對象CPoolProxy
鏈接獲取請求在沒有空閒鏈接但鏈接數沒達到閾值時經過鏈接池建立鏈接並池化放入available或者leased。leased鏈接數達到閾值時對請求進行堵塞,而且將Future<PoolEntry>放入pending。其餘請求釋放鏈接時會喚醒堵塞請求,被喚醒的請求獲取到鏈接後會被從pending列表中移除。spa

獲取鏈接

圖片描述

釋放鏈接

圖片描述

HttpResponse用HttpResponseProxy封裝,HttpResponseProxy同時包含了ConnectionHolder
HttpResponseProxy內部會使用ResponseEntityProxy對HttpResponse及其entity做進一步封裝,封裝中包含ConnectionHolder,以便在調用releaseConnection,或者關閉entity關閉流時能夠釋放鏈接到池中或不可複用時直接關閉。實際上當咱們調用entity.getContent時,返回的是EofSensorInputStream裝飾過的InputStream,在stream close時裏面會回調ResponseEntityProxy(實現了EofSensorWatcher)的streamClosed方法,從而調用connHolder.releaseConnection();實現鏈接的釋放。.net

參考:
http://hc.apache.org/ 文檔及源碼
http://blog.csdn.net/szwandcj...3d

相關文章
相關標籤/搜索