Netty中的ChannelHander詳解

channelHandler是用來作什麼的?ChannelHandler用來處理組件之間的交互,結合它的狀態作各類業務,經過ChannelPipelinel來鏈接各個ChannelHandler緩存

ChannelHandler怎麼在實際中使用?

channelHandler家族具備以下的結構安全


  • ChannelInboundHandler用來處理入站數據以及各類狀態變化。ChannelInboundHandlerAdapter對接口作適配,默認簡單的提交到ChannelPipeline的下一個ChannelHandler,在實現過程當中只須要專一重寫本身想要的方法便可,可是它不會自動的釋放與池化ByteBuf相關的內存,須要手動調用 ReferenceCountUtil.release()自動的實如今SimpleChannelInboundHandler,注意若是要傳遞給下一個ChannelHandler須要調用 ReferenceCountUtil.retain()
  • ChannelOutboundHandler處理出站數據而且容許攔截全部的操做。ChannelOutboundHandlerAdapter對接口作了適配,默認調用ChannelHandlerContext相同的方法,實現轉發到ChannelPipeline中的先一個ChannelHandler


Channel的各狀態詳解


當channel狀態發生變化會轉換成對應的事件交給ChannelHandler處理佈局

ChannelHandler的聲明週期詳解

  1. handlerAdded:添加到ChannelPipeline時調用
  2. handlerRemoved:從ChannelPipeline中移除時調用
  3. exceptionCaught:處理過程當中在ChannelPipeline中有錯誤產生時調用。對於入站異常來說,從錯誤發生的那一點開始繼續沿着入站方向流動,因此通常在最後一個ChannelInboundHandler實現。【出站異常通常經過返回的ChannelFuture註冊listenner,經過 channelFuture.isSuccess 來判斷是否出現異常,另外一種方式是將ChannelFutureListener做爲參數給寫方法的ChannelPromise,他適合相對簡單的異常處理】

ChannelHandler在ChannelPipeline中的佈局是怎樣的?


每一個新建的channel都會被分配一個新的channelpipeline,並且在channel的整個生命週期中,這永遠不會被改變線程

ChannelPipeline是怎麼操做ChannelHandler?

  • addFirst(addLast):將channelhandler做爲第一個(最後一個)處理器
  • addBefore(addAfter):在已經存在的channelhandler以前(以後)添加一個處理器
  • remove:從channelpipeline中刪除一個已經存在的channelhandler
  • replace:將原channelpipeline中的channelhandler替換成新的
  • fire開頭的方法:通常是調用channelpipeline中的下一個channelinboundchannelhandler對應的方法
  • 出站對應的write(read)則是寫(讀)channelpipeline的下一個channeloutboundhandler寫(讀)方法【其它出站方法相似】

ChannelHandlerContext與ChannelPipeline、ChannelHandler是什麼關係?


ChannelHandlerContext用於管理它所關聯的ChannelHandler和同一個ChannelPipeline中的下一個ChannelHandler的交互【每當有handler添加到pipleline時,都會建立context,建立以後context和handler的關係永遠都不會變,於是能夠緩存context的引用】,若是事件從channel或者channelpipeline上觸發將沿整個pipeline傳播,可是context上的相同觸發方式只會傳遞給pipeline上的下一個可以處理的handlercode

ChannelHandler是否能夠在多個ChannelPipeline中複用?

在實現的handler上方使用註解@Sharable【注意ChannelHandler自己處理邏輯的線程安全性】,這樣多個pipeline就能夠共享一個handler,這種方式能夠用來收集跨多個channel的統計信息cdn

相關文章
相關標籤/搜索