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的声明周期详解
- handlerAdded:添加到ChannelPipeline时调用
- handlerRemoved:从ChannelPipeline中移除时调用
- 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