Netty4——Handler執行順序

Netty4中, I / O事件由ChannelInboundHandler或ChannelOutboundHandler處理,並通過調用ChannelHandlerContext中定義的事件傳播方法(如ChannelHandlerContext.fireChannelRead(Object)和ChannelHandlerContext.write(Object))轉發給其最接近的處理程序。

補充說明:Netty4中的所有handler都實現自ChannelHandler接口。按照輸出輸出來分,分爲ChannelInboundHandlerChannelOutboundHandler兩大類。ChannelInboundHandler對從客戶端發往服務器的報文進行處理,一般用來執行解碼、讀取客戶端數據、進行業務處理等;ChannelOutboundHandler對從服務器發往客戶端的報文進行處理,一般用來進行編碼、發送報文到客戶端。

下圖描述了ChannelPipeline中的ChannelHandlers如何處理I / O事件。


Inbound(入站)事件由Inbound處理程序以自下而上的方向處理,如圖所示。Inbound處理程序通常處理由圖底部的I / O線程生成的Inbound數據。 Inbound數據通常通過實際的輸入操作(如SocketChannel.read(ByteBuffer))從遠程對等端讀取。 如果Inbound事件超出頂層入站處理程序,它將被靜默放棄,或者在需要您關注時進行記錄。

一個Outbound(出站)事件由Outbound處理程序在自上而下的方向進行處理,如圖所示。Outbound處理程序通常會生成或轉換Outbound流量,如寫入請求。 如果出站事件超出底部出站處理程序,則由與該通道關聯的I / O線程處理。 I / O線程經常執行實際的輸出操作,例如SocketChannel.write(ByteBuffer)。

例如,假設我們創建了以下管道:


 ChannelPipeline p = ...;
 p.addLast(“1”,new InboundHandlerA());
 p.addLast(“2”,new InboundHandlerB());
 p.addLast(“3”,new OutboundHandlerA());
 p.addLast(“4”,new OutboundHandlerB());
 p.addLast(“5”,new InboundOutboundHandlerX());
 
在上面的例子中,名稱以Inbound開頭的類意味着它是一個入站處理程序。名稱以Outbound開頭的類表示它是出站處理程序。
在給定的示例配置中,當事件進入時,處理程序評估順序爲1,2,3,4,5。當事件出站時,順序爲5,4,3,2,1。在此原則之上,ChannelPipeline跳過某些處理程序的評估以縮短堆棧深度:
    3和4不實現ChannelInboundHandler,因此入站事件的實際評估順序將爲:1,2和5。
    1和2不實現ChannelOutboundHandler,因此出站事件的實際評估順序將爲:5,4和3。
    如果5實現ChannelInboundHandler和ChannelOutboundHandler,則入站和出站事件的評估順序可分別爲125和543。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章