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

2021-08-23 11:19:48 字數 2440 閱讀 2871

說的abstractpollingioacceptor類似,它繼承自abstractioconnector,兩個泛型引數分別是所處理的會話和客戶端socket連線。底層的sockets會被不斷檢測,並當有任何乙個socket需要被處理時就會被喚醒去處理。這個類封裝了客戶端socket的bind,connect和dispose等動作,其成員變數executor用於發起連線請求,另乙個abstractpollingioprocessor用於處理已經連線客戶端的i/o操作請求,如讀寫和關閉連線。

其最重要的幾個成員變數是:

private

final

queue

<

connectionrequest

>

connectqueue

=new

concurrentlinkedqueue

<

connectionrequest

>

();//

連線佇列

private

final

queue

<

connectionrequest

>

cancelqueue

=new

concurrentlinkedqueue

<

connectionrequest

>

();//

取消連線佇列

先來看看當服務端呼叫connect後的處理過程:

protected

final

connectfutureconnect0(

socketaddressremoteaddress,socketaddresslocaladdress,

iosessioninitializer

<?

extends

connectfuture

>

sessioninitializer)

success

=true;}

catch

(exceptione)

finally

catch

(exceptione)}}

connectionrequestrequest

=new

connectionrequest(handle,sessioninitializer);

connectqueue.add(request);

//連線請求加入連線佇列中

startupworker();

//開啟工作執行緒處理連線請求

wakeup();

//中斷select操作

return

request;}

真正的負責處理客戶端請求的工作都是worker執行緒完成的,

private

class

worker

implements

runnable

processtimedoutsessions(allhandles());

//處理超時連線請求

nhandles

-=cancelkeys();

if(nhandles==0

)}}}

catch

(throwablee)

catch

(interruptedexceptione1)}}

if(selectable

&&isdisposing())

}finally}}

catch

(exceptione)

finally}}

}}private

intregisternew()

hhandle

=req.handle;

trycatch

(exceptione)

catch

(exceptione2)}}

return

nhandles;

}private

intprocesssessions(iterator

<

h>

handlers)

success

=true;}

catch

(throwablee)

finally}}

return

nhandles;

}private

void

processtimedoutsessions(iterator

<

h>

handles)}}

private

intcancelkeys()

hhandle

=req.handle;

trycatch

(exceptione)

finally

}return

nhandles;}

)出處:

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

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

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

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

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

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