netty源碼分析(24)- pipeline總結

從18到23節都是在學習pipeline裏面的內容,包括了ChannelHandlerChannelHandlerContext,事件的傳播。本節進行總結一下。

  • pipeline初始化:在服務端channel客戶端channel創建的時候被創建。創建pipeline的是她們的公共父類AbstractChannel
  • 添加刪除ChannelHandlerpipeline的結構是雙向鏈表結構,每一個節點都是ChannelHandlerContext,裏面包裝了用戶自定義的ChannelHandler。添加和刪除ChannelHandler最終都是刪除其對應的ChannelHandlerContext節點。而在添加ChannelHandlerContext的過程中,使用instanceofinbound/outbound屬性來判斷ChannelHandler的類型。
  • pipeline的默認結構:pipeline創建時固定創建HeadContextTailContext作爲頭節點和尾節點。HeadContext節點,該節點持有一個unsafe,負責實現具體協議(具體的事件處理),而TailContext起到了終止事件和異常傳播的作用。
  • pipeline的傳播機制:分爲三種
  1. inbound事件的的同類順序傳播
  2. outbound事件的同類逆序傳播
  3. exception事件鏈表順序傳播
三個問題
  • netty時如何判斷ChannelHandler類型的?

當調用pipeline.addLast(handler)的時候,其過程會實例化一個ChannelHandlerContext,其過程會調用instanceof關鍵子,判斷handler是屬於ChannelInboundHandler還是ChannelOutboundHandler,分別用boolean類型的變量inboundoutbound來標識。

  • 對於ChannelHandler的添加應該遵循怎麼樣的順序?

inbound類型的事件傳播和添加順序正相關而outbound類型的事件和添加順序逆相關

  • 用戶手動觸發事件傳播,不同的觸發方式有什麼不同?

觸發方式大體分兩種,從開始節點觸發從當前節點觸發
當用戶調用類似ctx.channel().pipeline().fireXXX()的時候,表示從開始節點觸發,對於inbound事件和exception事件來說,開始節點是HeadContext,對於outbound事件來說,開始節點是TailContext
當用戶調用ctx.fireXXXctx.write(XX)的時候,表示從當前節點觸發,事件往下進行傳播。

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