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

2021-08-22 20:38:04 字數 2105 閱讀 2797

介紹了幾個核心的介面,這一篇主要介紹實現這些介面的抽象基類。首先是實現ioservice介面的abstractioservice類。它包含了乙個executor來處理到來的事件。每個abstractioservice都乙個atomicinteger型別的id號,確保每個id的唯一性。

它內部的executor可以選擇是從外部傳遞進建構函式中,也可以在例項內部自行構造,若是後者,則它將是threadpoolexecutor類的乙個例項,即是executor執行緒池中的一員。**如下: if

(executor

==null

)else

其中有乙個idlestatuschecker成員,它用來對服務的空閒狀態進行檢查,在乙個服務啟用時會將服務納入到檢查名單中,而在服務失效時會將服務從名單中剔除。會單獨開乙個執行緒進行具體的空閒檢查,這是通過下面這個執行緒類來負責的:

private

class

notifyingtaskimpl

implements

notifyingtask

catch

(interruptedexceptione)}}

finally}}

具體的空閒檢查**如下,超過能容忍的最大空閒時間,就會fire出sessionidle事件,上文也說過空閒有三種型別:讀端空,寫端空,雙端空。

notifyidlesession1(s,currenttime,

s.getconfig().getidletimeinmillis(idlestatus.both_idle),idlestatus.both_idle,math.max(s.getlastiotime(),s.getlastidletime(idlestatus.both_idle)));

private

static

void

notifyidlesession1(

abstractiosessionsession,

long

currenttime,

long

idletime,idlestatusstatus,

long

lastiotime)}

在釋放資源的方法時,首先去獲取釋放鎖disposallock才行,然後具體的釋放動作是通過dispose0完成的,接著取消掉空閒檢查執行緒,此外,若執行緒是內部建立的執行緒池中的一員,則通過執行緒池去關閉執行緒。

public

final

void

dispose()

catch

(exceptione)

finally}}

}idlestatuschecker.getnotifyingtask().cancel();

if(disposalfuture

!=null)if

(createdexecutor)

catch

(interruptedexceptione1)}}

disposed

=true;}

再來看會話初始化完成後的動作每個session都保持有自己的屬性對映圖,在會話結束初始化時,應該設定這個attributemap。

((abstractiosession)session).setattributemap(session.getservice()

.getsessiondatastructurefactory().getattributemap(session));

除此以為,還應該為會話配置寫請求佇列:

((abstractiosession)session).setwriterequestqueue(session

.getservice().getsessiondatastructurefactory()

.getwriterequestqueue(session));

在初始化時會在會話的屬性中加入一項session_created_future,這個屬性會在連線真正建立後從會話中去除。 if

(future

!=null

&&future

instanceof

connectfuture)

使用者特定的初始化動作在finishsessioninitialization0這個方法中自行實現。

出處:

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

其中有乙個idlestatuschecker成員,它用來對服務的空閒狀態進行檢查,在乙個服務啟用時會將服務納入到檢查名單中,而在服務失效時會將服務從名單中剔除。會單獨開乙個執行緒進行具體的空閒檢查,這是通過下面這個執行緒類來負責的 具體的空閒檢查 如下,超過能容忍的最大空閒時間,就會fire出ses...

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

abstractioacceptor類繼承自abstractioservice基類,並實現了ioacceptor介面,它主要的成員變數是本地繫結位址。在呼叫bind或unbind方法時需要先獲取繫結鎖bindlock,具體的繫結操作還是在bind0這個方法中實現的。一旦繫結成功後,就會向服務監聽者發...

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

前面介紹過iosessionrecycler是負責 不再使用的會話的介面,expiringsessionrecycler是其乙個實現類,用於 超時失效的會話。private expiringmapsessionmap 待處理的會話集 private expiringmap.expirer mapex...