Mina2 0框架原始碼剖析(五)

2021-04-30 02:59:16 字數 1749 閱讀 9814

前面介紹過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...