MINA核心结构和处理消息的逻辑流程
1.MINA 核心結構
IoService
最底層的是IOService,負責具體的IO相關工作。這一層的典型代表有IOSocketAcceptor和IOSocketChannel,分別對應TCP協議下的服務端和客戶端的IOService。IOService的意義在于隱藏底層IO的細節,對上提供統一的基于事件的異步IO接口。每當有數據到達時,IOService會先調用底層IO接口讀取數據,封裝成IoBuffer,之后以事件的形式通知上層代碼,從而將Java NIO的同步IO接口轉化成了異步IO。所以從圖上看,進來的low-level IO經過IOService層后變成IO Event。
具體的代碼可以參考org.apache.mina.core.polling.AbstractPollingIoProcessor的私有內部類Processor。
IoFilterChain
Mina的設計理念之一就是業務代碼和數據包處理代碼分離,業務代碼只專注于業務邏輯,其他的邏輯如:數據包的解析,封裝,過濾等則交由IoFilterChain來處理。IoFilterChain可以看成是Mina處理流程的擴展點。這樣的劃分使得結構更加清晰,代碼分工更明確。開發者通過往Chain中添加IoFilter,來增強處理流程,而不會影響后面的業務邏輯代碼。
IoHandler
IoHandler是實現業務邏輯的地方,需要有開發者自己來實現這個接口。IoHandler可以看成是Mina處理流程的終點,每個IoService都需要指定一個IoHandler。
IoSession
IoSession是對底層連接的封裝,一個IoSession對應于一個底層的IO連接(在Mina中UDP也被抽象成了連接)。通過IoSession,可以獲取當前連接相關的上下文信息,以及向遠程peer發送數據。發送數據其實也是個異步的過程。發送的操作首先會逆向穿過IoFilterChain,到達IoService。但IoService上并不會直接調用底層IO接口來將數據發送出去,而是會將該次調用封裝成一個WriteRequest,放入session的writeRequestQueue中,最后由IoProcessor線程統一調度flush出去。所以發送操作并不會引起上層調用線程的阻塞。
2.MINA處理消息的邏輯流程
第1種:
- IOAcceptor 監聽網絡數據包傳入的連接;
- 為每個新的連接(Connection)創建一個session,同一個端口+ip的后續請求將通過session進行處理;
- 同一個session收到的所有數據,通過過濾鏈進行過濾.通過PacketEncoder/Decoder進行有效的編碼,解碼處理(負責把底層傳輸的對象拼裝為更高一層的對象方便后續的處理,最后傳輸的數據被交給IOHandler);
- 最后根據自己的業務需求完成Handler的業務邏輯處理.
第2種:
通過SocketAcceptor 同客戶端建立連接;
連接建立之后 I/O的讀寫交給了I/O Processor線程,I/O Processor是多線程的;
通過I/O Processor 讀取的數據經過IoFilterChain里所有配置的IoFilter, IoFilter 進行消息的過濾,格式的轉換,在這個層面可以制定一些自定義的協議;
最后 IoFilter 將數據交給 Handler 進行業務處理,完成了整個讀取的過程;
寫入過程也是類似,只是剛好倒過來,通過IoSession.write 寫出數據,然后Handler進行寫入的業務處理,處理完成后交給IoFilterChain,進行消息過濾和協議的轉換,最后通過 I/O Processor 將數據寫出到 socket 通道。
總結
以上是生活随笔為你收集整理的MINA核心结构和处理消息的逻辑流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wxWidgets随笔(1)-hello
- 下一篇: wxWidgets随笔(2)-hello