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

2021-08-23 11:19:48 字數 3459 閱讀 3324

上文的內容還有一些沒有結尾,這篇補上。在expiringmap類中,使用了乙個私有內部類expiringobject來表示待檢查超時的物件,它包括三個域,鍵,值,上次訪問時間,以及用於上次訪問時間這個域的讀寫鎖:

private

kkey;

private

vvalue;

private

long

lastaccesstime;

private

final

readwritelocklastaccesstimelock

=new

reentrantreadwritelock();

而expiringmap中包括了下述幾個變數:

private

final

concurrenthashmap

<

k,expiringobject

>

delegate;

//超時**集合,儲存待檢查物件

private

final

copyonwritearraylist

<

expirationlistener

<

v>>

expirationlisteners;

//超時監聽者

private

final

expirerexpirer;

//超時檢查執行緒

現在再來看看iosession的乙個抽象實現類abstractiosession。這是它的幾個重要的成員變數:

private

iosessionattributemapattributes;

//會話屬性對映圖

private

writerequestqueuewriterequestqueue;

//寫請求佇列

private

writerequestcurrentwriterequest;

//當前寫請求

當要結束當前會話時,會傳送乙個乙個寫請求close_request。而closefuture這個closefuture會在連線關閉時狀態被設定為」closed」,它的***是scheduled_counter_resetter。

close和closeonflush都是非同步的關閉操作,區別是前者立即關閉連線,而後者是在寫請求佇列中放入乙個close_request,並將其即時重新整理出去,若要真正等待關閉完成,需要呼叫方在返回的closefuture等待

public

final

closefutureclose()

else

}getfilterchain().firefilterclose();

//fire出關閉事件

return

closefuture;

}public

final

closefuturecloseonflush()

下面來看看讀資料的過程:

public

final

closefutureclose()

else

}getfilterchain().firefilterclose();

//fire出關閉事件

return

closefuture;

}public

final

closefuturecloseonflush()

private

queue

<

readfuture

>

getreadyreadfutures()

}return

readyreadfutures;

}public

final

readfutureread()

queue

<

readfuture

>

readyreadfutures

=getreadyreadfutures();

//獲取已經可被讀資料佇列

readfuturefuture;

synchronized

(readyreadfutures)

}else

}return

future;}

再來看寫資料到指定遠端位址的過程,可以寫三種型別資料:iobuffer,整個檔案或檔案的部分區域,這會通過傳遞寫請求給過濾器鏈條來完成資料向目的遠端的傳輸。

public

final

writefuturewrite(objectmessage,socketaddressremoteaddress)

else

if(message

instanceof

filechannel)

else

if(message

instanceof

file)

}catch

(ioexceptione)

writefuturefuture

=new

defaultwritefuture(

this

);getfilterchain().firefilterwrite(

newdefaultwriterequest(message,future,remoteaddress));

//構造寫請求,通過過濾器鏈傳送出去,寫請求中指明了要傳送的訊息,目的位址,以及返回的結果

//如果開啟了乙個檔案通道(傳送的檔案的部分區域或全部),就必須在寫請求完成時關閉檔案通道

if(openedfilechannel

!=null

)catch

(ioexceptione)

}});

}return

future;

//寫請求成功完成}

最後,來看看乙個writerequestqueue的實現,唯一加入的乙個功能就是若在隊頭發現是請求關閉,則會去關閉會話。

private

class

closerequestawarewriterequestqueue

implements

writerequestqueue

public

synchronized

writerequestpoll(iosessionsession)

return

answer;

}public

void

offer(iosessionsession,writerequeste)

public

boolean

isempty(iosessionsession)

public

void

clear(iosessionsession)

public

void

dispose(iosessionsession)}

)出處:

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

上文的內容還有一些沒有結尾,這篇補上。在expiringmap類中,使用了乙個私有內部類expiringobject來表示待檢查超時的物件,它包括三個域,鍵,值,上次訪問時間,以及用於上次訪問時間這個域的讀寫鎖 private k key private v value private long l...

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

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

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

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