从18到23节都是在学习pipeline里面的内容,包括了ChannelHandler,ChannelHandlerContext,事件的传播。本节进行总结一下。
-
pipeline初始化:在服务端channel和客户端channel创建的时候被创建。创建pipeline的是她们的公共父类AbstractChannel - 添加删除
ChannelHandler:pipeline的结构是双向链表结构,每一个节点都是ChannelHandlerContext,里面包装了用户自定义的ChannelHandler。添加和删除ChannelHandler最终都是删除其对应的ChannelHandlerContext节点。而在添加ChannelHandlerContext的过程中,使用instanceof和inbound/outbound属性来判断ChannelHandler的类型。 -
pipeline的默认结构:pipeline创建时固定创建HeadContext和TailContext作为头节点和尾节点。HeadContext节点,该节点持有一个unsafe,负责实现具体协议(具体的事件处理),而TailContext起到了终止事件和异常传播的作用。 -
pipeline的传播机制:分为三种
inbound事件的的同类顺序传播outbound事件的同类逆序传播exception事件链表顺序传播
三个问题
- netty时如何判断
ChannelHandler类型的?
当调用
pipeline.addLast(handler)的时候,其过程会实例化一个ChannelHandlerContext,其过程会调用instanceof关键子,判断handler是属于ChannelInboundHandler还是ChannelOutboundHandler,分别用boolean类型的变量inbound和outbound来标识。
- 对于
ChannelHandler的添加应该遵循怎么样的顺序?
inbound类型的事件传播和添加顺序正相关而outbound类型的事件和添加顺序逆相关
- 用户手动触发事件传播,不同的触发方式有什么不同?
触发方式大体分两种,
从开始节点触发,从当前节点触发。
当用户调用类似ctx.channel().pipeline().fireXXX()的时候,表示从开始节点触发,对于inbound事件和exception事件来说,开始节点是HeadContext,对于outbound事件来说,开始节点是TailContext。
当用户调用ctx.fireXXX或ctx.write(XX)的时候,表示从当前节点触发,事件往下进行传播。