Netty的ChannelPipeline是ChannelHandler的容器,它负责ChannelHandler的管理和事件拦截与调度。
这里看下有个Pipeline的一些初始化工作:
代码分析
- ChannelPipeline的创建工作,ChannelPipeline是在AbstractChannel的newChannelPipeline方法中创建,并且将当前对象传递进去。
而调用newChannelPipeline的时候是Channel进行创建的时候,所以Channel与Pipeline基本上是同时创建的。或者说Pipeline在Channel内部创建。

- DefaultChannelPipeline的构造器。在构造DefaultChannelPipeline的时候,重点是创建了TailContext与HeadContext,并且Context的构造参数都是pipline。



- HeadContext多了unsafe,inbound为false,outbound为true
- TailContext的inbound为true,outbound为false
setComplete涉及到cas的用法,就是标记一下状态位。
- ChannelPipeline的构造工作很少,但是它既然是ChannelHandler的容器,当对ChannelHandler进行管理的时候是什么样的呢。先看看ChannelHandler都会有handlerAdded和handlerRemoved方法。

- 添加ChannelHandler,其内部调用的是addLast方法。



在添加ChannelHandler的时候:
- 首先检查这个ChannelHandler是不是重复添加了,如果重复的,那么是否可共享,参加checkMultiplicity。
- newContext会创建DefaultChannelHandlerContext,入参:当前的pipeline,group(执行器),name,ChannelHandler
- addLast0就是链表的添加删除。
- 最后调用写好的ChannelHandler的handlerAdded方法。
// 创建ctx的时候,将handler传递了进去,再调用handler方法获取handler,然后调用handler的handlerAdde方法。
ctx.handler().handlerAdded(ctx);
- ChannelHandler的删除。既然看过了添加,那么也看一下删除ChannelHandler的工作。


- 基本上都是对已经添加的ChannelHandler进行遍历工作,找到对应的Handler构建的AbstractChannelHandlerContext。
- remove0是链表的删除
- 再调用ChannelHandler的handlerRemoved的方法。
最后
这里简单说明下ChannelPipeline的创建工作与对ChannelHandler的管理,ChannelPipeline还有事件的传播属性,下回分析。
网友评论