从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)
的时候,表示从当前节点触发,事件往下进行传播。
网友评论