從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)
的時候,表示從當前節點觸發,事件往下進行傳播。