阅读更多
1 前言
本篇博文以DefaultChannelPipeline为例对ChannelPipeLine的结构进行分析
2 继承结构
DefaultChannelPipeline继承关系比较简单,如下图
2.1 ChannelOutboundInvoker
ChannelOutboundInvoker接口定义了与ChannelOutboundHandler相似的方法
2.2 ChannelInboundInvoker
ChannelInboundInvoker接口定义了与ChannelInboundHandler相似的方法
2.3 ChannelPipeline
ChannelPipeline增加了一些用于添加和删除Handler的方法。ChannelPipeline的作用就是管理Handler,以及在特定位置触发相应的Handler,从而织入Netty内置的Handler或者用户自定义的Handler
3 DefaultChannelPipeline
DefaultChannelPipeline为ChannelPipeline接口提供了基本的实现
DefaultChannelPipeline的作用就是用于存放所有Netty内置的Handler或者用户自定义的Handler,并且提供触发这些Handler的方法
包含如下重要字段
AbstractChannelHandlerContext head
:Pipeline中所有的Handler形成一个双向链表,这是表头AbstractChannelHandlerContext tail
:Pipeline中所有的Handler形成一个双向链表,这是表尾Channel channel
:关联的Channel,一个Pipeline与一个Channel一一对应Map<EventExecutorGroup, EventExecutor> childExecutors
:每个Pipeline可能在不同的EventExecutorGroup中都关联一个EventExecutor,用于存放键值对的MapfirstRegistration = true
:用于标记是否第一次执行注册操作,由于有些handler仅在第一次触发register操作的时候才会执行,例如handlerAdded
方法(一般与ChannelInitializer配合注入用户自定义的或者Netty内置的Handler到pipeline中去),该handlerAdded方法通过PendingHandlerCallback的execute方法触发PendingHandlerCallback pendingHandlerCallbackHead
:用于触发一些特定的Handler,例如handlerAdded
方法,该方法通常只触发一次。与firstRegistration
字段密切相关
此外,head字段绑定的Handler与tail字段绑定的Handler是两个特殊的Handler,这两个特殊的Handler位于整个pipeline的首尾,因此会进行一些额外的预处理或者收尾工作