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

相关文章
相关标签/搜索