netty原始碼分析(24)- pipeline總結
從18到23節都是在學習pipeline
裡面的內容,包括了ChannelHandler
,ChannelHandlerContext
,事件的傳播。本節進行總結一下。
-
pipeline
初始化:在服務端channel
和客戶端channel
建立的時候被建立。建立pipeline
的是她們的公共父類AbstractChannel
-
新增刪除
ChannelHandler
:pipeline
的結構是雙向連結串列結構,每一個節點都是ChannelHandlerContext
,裡面包裝了使用者自定義的ChannelHandler
。新增和刪除ChannelHandler
最終都是刪除其對應的ChannelHandlerContext
節點。而在新增ChannelHandlerContext
的過程中,使用instanceof
和inbound/outbound
屬性來判斷ChannelHandler
的型別。 -
pipeline
的預設結構:pipeline
建立時固定建立HeadContext
和TailContext
作為頭節點和尾節點。HeadContext
節點,該節點持有一個unsafe
,負責實現具體協議(具體的事件處理),而TailContext
起到了終止事件和異常傳播的作用。 -
pipeline
的傳播機制:分為三種
inbound outbound exception
三個問題
-
netty時如何判斷
ChannelHandler
型別的?
當呼叫pipeline.addLast(handler)
的時候,其過程會例項化一個ChannelHandlerContext
,其過程會呼叫instanceof
關鍵子,判斷handler
是屬於ChannelInboundHandler
還是ChannelOutboundHandler
,分別用boolean
型別的變數inbound
和outbound
來標識。
-
對於
ChannelHandler
的新增應該遵循怎麼樣的順序?
inbound
型別的事件傳播和新增順序正相關而outbound
型別的事件和新增順序逆相關
- 使用者手動觸發事件傳播,不同的觸發方式有什麼不同?
觸發方式大體分兩種,從開始節點觸發
,從當前節點觸發
。
當用戶呼叫類似ctx.channel().pipeline().fireXXX()
的時候,表示從開始節點觸發
,對於inbound
事件和exception
事件來說,開始節點是HeadContext
,對於outbound
事件來說,開始節點是TailContext
。
當用戶呼叫ctx.fireXXX
或ctx.write(XX)
的時候,表示從當前節點觸發,事件往下進行傳播。