channelHandler是用來作什麼的?ChannelHandler用來處理組件之間的交互,結合它的狀態作各類業務,經過ChannelPipelinel來鏈接各個ChannelHandler緩存
ChannelHandler怎麼在實際中使用?
channelHandler家族具備以下的結構安全
![](http://static.javashuo.com/static/loading.gif)
- ChannelInboundHandler用來處理入站數據以及各類狀態變化。ChannelInboundHandlerAdapter對接口作適配,默認簡單的提交到ChannelPipeline的下一個ChannelHandler,在實現過程當中只須要專一重寫本身想要的方法便可,可是它不會自動的釋放與池化ByteBuf相關的內存,須要手動調用
ReferenceCountUtil.release()
自動的實如今SimpleChannelInboundHandler,注意若是要傳遞給下一個ChannelHandler須要調用 ReferenceCountUtil.retain()
- ChannelOutboundHandler處理出站數據而且容許攔截全部的操做。ChannelOutboundHandlerAdapter對接口作了適配,默認調用ChannelHandlerContext相同的方法,實現轉發到ChannelPipeline中的先一個ChannelHandler
Channel的各狀態詳解
![](http://static.javashuo.com/static/loading.gif)
當channel狀態發生變化會轉換成對應的事件交給ChannelHandler處理佈局
ChannelHandler的聲明週期詳解
- handlerAdded:添加到ChannelPipeline時調用
- handlerRemoved:從ChannelPipeline中移除時調用
- exceptionCaught:處理過程當中在ChannelPipeline中有錯誤產生時調用。對於入站異常來說,從錯誤發生的那一點開始繼續沿着入站方向流動,因此通常在最後一個ChannelInboundHandler實現。【出站異常通常經過返回的ChannelFuture註冊listenner,經過
channelFuture.isSuccess
來判斷是否出現異常,另外一種方式是將ChannelFutureListener做爲參數給寫方法的ChannelPromise,他適合相對簡單的異常處理】
ChannelHandler在ChannelPipeline中的佈局是怎樣的?
![](http://static.javashuo.com/static/loading.gif)
每一個新建的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是什麼關係?
![](http://static.javashuo.com/static/loading.gif)
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