前面介紹過iosessionrecycler是負責**不再使用的會話的介面,expiringsessionrecycler是其乙個實現類,用於**超時失效的會話。
private expiringmapsessionmap;//待處理的會話集
private expiringmap.expirer mapexpirer;//負責具體的**工作
sessionmap的鍵是由本地位址和遠端位址共同組成的,值是這兩個位址對應的會話。
expirer類實現了runnable介面,這個執行緒負責監控expiringmap,並把expiringmap中超過閥值的元素從expiringmap中移除。這個執行緒呼叫了setdaemon(true),因此是作為守護執行緒在後台執行。具體的處理過程如下:
啟動/關閉超時檢查執行緒都需要進行封鎖機制,這裡使用的是讀寫鎖:
會話超時監聽者:
上文的內容還有一些沒有結尾,這篇補上。在expiringmap類中,使用了乙個私有內部類expiringobject來表示待檢查超時的物件,它包括三個域,鍵,值,上次訪問時間,以及用於上次訪問時間這個域的讀寫鎖:
而expiringmap中包括了下述幾個變數:
現在再來看看iosession的乙個抽象實現類abstractiosession。這是它的幾個重要的成員變數:
當要結束當前會話時,會傳送乙個乙個寫請求close_request。而closefuture這個closefuture會在連線關閉時狀態被設定為」closed」,它的***是scheduled_counter_resetter。
close和closeonflush都是非同步的關閉操作,區別是前者立即關閉連線,而後者是在寫請求佇列中放入乙個close_request,並將其即時重新整理出去,若要真正等待關閉完成,需要呼叫方在返回的closefuture等待
下面來看看讀資料的過程:
最後,來看看乙個writerequestqueue的實現,唯一加入的乙個功能就是若在隊頭發現是請求關閉,則會去關閉會話。
前面介紹完了org.apache.mina.core.session這個包,現在開始進入org.apache.mina.core. polling包。這個包裡包含了實現基於輪詢策略(比如nio的select呼叫或其他型別的i/o輪詢系統呼叫(如epoll,poll,kqueue等)的基類。
先來看abstractpollingioacceptor這個抽象基類,它繼承自abstractioacceptor,兩個泛型引數分別是所處理的會話和伺服器端socket連線。底層的sockets會被不斷檢測,並當有任何乙個socket需要被處理時就會被喚醒去處理。這個類封裝了伺服器端socket的bind,accept和dispose等動作,其成員變數executor負責接受來自客戶端的連線請求,另乙個abstractpollingioprocessor用於處理客戶端的i/o操作請求,如讀寫和關閉連線。
其最重要的幾個成員變數是:
先來看看當服務端呼叫bind後的處理過程:
真正的負責接收客戶端請求的工作都是worker執行緒完成的,
這個類中有個地方值得注意,就是wakeup方法,它是用來中斷select方法的,當註冊佇列或取消註冊佇列發生變化時需要呼叫它,可以參看本類的乙個子類niosocketacceptor的實現:
我們可以查閱jdk文件,它對selector的select方法有如下解釋:選擇一組鍵,其相應的通道已為 i/o 操作準備就緒。 此方法執行處於阻塞模式的選擇操作。僅在至少選擇乙個通道、呼叫此選擇器的 wakeup 方法、當前的執行緒已中斷,或者給定的超時期滿(以先到者為準)後此方法才返回。
Mina2 0框架原始碼剖析(二)
其中有乙個idlestatuschecker成員,它用來對服務的空閒狀態進行檢查,在乙個服務啟用時會將服務納入到檢查名單中,而在服務失效時會將服務從名單中剔除。會單獨開乙個執行緒進行具體的空閒檢查,這是通過下面這個執行緒類來負責的 具體的空閒檢查 如下,超過能容忍的最大空閒時間,就會fire出ses...
Mina2 0框架原始碼剖析(三)
abstractioacceptor類繼承自abstractioservice基類,並實現了ioacceptor介面,它主要的成員變數是本地繫結位址。在呼叫bind或unbind方法時需要先獲取繫結鎖bindlock,具體的繫結操作還是在bind0這個方法中實現的。一旦繫結成功後,就會向服務監聽者發...
Mina2 0框架原始碼剖析(二)
介紹了幾個核心的介面,這一篇主要介紹實現這些介面的抽象基類。首先是實現ioservice介面的abstractioservice類。它包含了乙個executor來處理到來的事件。每個abstractioservice都乙個atomicinteger型別的id號,確保每個id的唯一性。它內部的exec...