Pipeline & Handler
每一个Channel都包含一个Pipeline,Pipeline以带头尾节点双向链表的数据结构管理着其中众多的Handler
每一个Handler都是一道对Channel中传输数据的加工工序。
Handler的分类
按数据流动方向分类
多个InboudHandler(入栈处理器)在Pipeline中时,由头节点开始往尾节点方向依次执行
多个OutboudHandler(出栈处理器)在Pipeline中时
- 当使用
channel.writeAndFlush()方法触发出栈时,由尾节点开始往头节点方向依次执行 - 当使用
ctx.writeAndFlush()方法触发出栈时,由当前节点开始往头节点方向依次执行
按是否可以共享分类
有些Handler的一个对象实例是可以被多个Channel各自的Pipeline共用的,例如LoggingHandler之类线程安全,无状态的Handler,区别这些Handler的方式为查看该Handler是否有被标注@Sharable注释。
关于自定义Handler是否可以共享,详细可以查看Codec章节
在多个Handler之间传递信息
//InboudHandler
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
Object nextMessage = handle(msg);//处理当前信息并产生新的信息
super.channelRead(ctx,nextMessage);//将新信息传递给下一个Handler
}
//OutboudHandler
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
Object nextMessage = handle(msg);//处理当前信息并产生新的信息
super.write(ctx, nextMessage, promise);//将新信息传递给下一个Handler
}
实用的Handler
SimpleChannelInboundHandler在泛型处可以指定只处理某个特定类型的消息,消息会被自动释放ChannelInboundHandlerAdapter有默认实现的入栈处理器ChannelDuplexHandler同时处理入栈与出栈两个方向的处理器,常用于记录拦截与状态统计CombinedChannelDuplexHandler用于组合已有的InboudHandelr与OutboudHandelrIdleStateHandler空闲检测处理器,常用于与实现userEventTriggered事件的ChannelDuplexHandler一起实现心跳机制
EmbeddedChannel模拟调试出入栈
EmbeddedChannel cn = new EmbeddedChannel(in1,in2,out1,out2);
cn.writeInbound();//模拟入栈
cn.writeOutbound();//模拟出栈