Netty-Pipeline源码解析(创建与ChannelHandler管理)

0.401字数 459阅读 114

Netty的ChannelPipeline是ChannelHandler的容器,它负责ChannelHandler的管理和事件拦截与调度。

这里看下有个Pipeline的一些初始化工作:

代码分析

  1. ChannelPipeline的创建工作,ChannelPipeline是在AbstractChannel的newChannelPipeline方法中创建,并且将当前对象传递进去。

而调用newChannelPipeline的时候是Channel进行创建的时候,所以Channel与Pipeline基本上是同时创建的。或者说Pipeline在Channel内部创建。


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

image

image
  • HeadContext多了unsafe,inbound为false,outbound为true
  • TailContext的inbound为true,outbound为false

setComplete涉及到cas的用法,就是标记一下状态位。

  1. ChannelPipeline的构造工作很少,但是它既然是ChannelHandler的容器,当对ChannelHandler进行管理的时候是什么样的呢。先看看ChannelHandler都会有handlerAdded和handlerRemoved方法。
image
  1. 添加ChannelHandler,其内部调用的是addLast方法。
image

image
image

在添加ChannelHandler的时候:

  • 首先检查这个ChannelHandler是不是重复添加了,如果重复的,那么是否可共享,参加checkMultiplicity。
  • newContext会创建DefaultChannelHandlerContext,入参:当前的pipeline,group(执行器),name,ChannelHandler
  • addLast0就是链表的添加删除。
  • 最后调用写好的ChannelHandler的handlerAdded方法。
// 创建ctx的时候,将handler传递了进去,再调用handler方法获取handler,然后调用handler的handlerAdde方法。
ctx.handler().handlerAdded(ctx);
  1. ChannelHandler的删除。既然看过了添加,那么也看一下删除ChannelHandler的工作。
image
image
  • 基本上都是对已经添加的ChannelHandler进行遍历工作,找到对应的Handler构建的AbstractChannelHandlerContext。
  • remove0是链表的删除
  • 再调用ChannelHandler的handlerRemoved的方法。

最后

这里简单说明下ChannelPipeline的创建工作与对ChannelHandler的管理,ChannelPipeline还有事件的传播属性,下回分析。

推荐阅读更多精彩内容