Netty - Pipeline & Handler

64 阅读2分钟

Pipeline & Handler

每一个Channel都包含一个PipelinePipeline带头尾节点双向链表的数据结构管理着其中众多的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用于组合已有InboudHandelrOutboudHandelr
  • IdleStateHandler空闲检测处理器,常用于与实现userEventTriggered事件的ChannelDuplexHandler一起实现心跳机制

EmbeddedChannel模拟调试出入栈

EmbeddedChannel cn = new EmbeddedChannel(in1,in2,out1,out2);
cn.writeInbound();//模拟入栈
cn.writeOutbound();//模拟出栈