netty源码分析(24)- pipeline总结

从18到23节都是在学习pipeline里面的内容,包括了ChannelHandlerChannelHandlerContext,事件的传播。本节进行总结一下。

  • pipeline初始化:在服务端channel客户端channel创建的时候被创建。创建pipeline的是她们的公共父类AbstractChannel
  • 添加删除ChannelHandlerpipeline的结构是双向链表结构,每一个节点都是ChannelHandlerContext,里面包装了用户自定义的ChannelHandler。添加和删除ChannelHandler最终都是删除其对应的ChannelHandlerContext节点。而在添加ChannelHandlerContext的过程中,使用instanceofinbound/outbound属性来判断ChannelHandler的类型。
  • pipeline的默认结构:pipeline创建时固定创建HeadContextTailContext作为头节点和尾节点。HeadContext节点,该节点持有一个unsafe,负责实现具体协议(具体的事件处理),而TailContext起到了终止事件和异常传播的作用。
  • pipeline的传播机制:分为三种
  1. inbound事件的的同类顺序传播
  2. outbound事件的同类逆序传播
  3. exception事件链表顺序传播
三个问题
  • netty时如何判断ChannelHandler类型的?

当调用pipeline.addLast(handler)的时候,其过程会实例化一个ChannelHandlerContext,其过程会调用instanceof关键子,判断handler是属于ChannelInboundHandler还是ChannelOutboundHandler,分别用boolean类型的变量inboundoutbound来标识。

  • 对于ChannelHandler的添加应该遵循怎么样的顺序?

inbound类型的事件传播和添加顺序正相关而outbound类型的事件和添加顺序逆相关

  • 用户手动触发事件传播,不同的触发方式有什么不同?

触发方式大体分两种,从开始节点触发从当前节点触发
当用户调用类似ctx.channel().pipeline().fireXXX()的时候,表示从开始节点触发,对于inbound事件和exception事件来说,开始节点是HeadContext,对于outbound事件来说,开始节点是TailContext
当用户调用ctx.fireXXXctx.write(XX)的时候,表示从当前节点触发,事件往下进行传播。

你可能感兴趣的:(netty源码分析(24)- pipeline总结)