Pipeline的初始化
ChannelPipeline是一个双向链表,在Channel构建的过程中,创建了ChannelPipeline,初始化了头结点head和尾节点tail:
1 | public abstract class AbstractChannel extends DefaultAttributeMap implements Channel { |
HeadContext
HeadContext是头结点,它既实现了ChannelOutboundHandler又实现了ChannelInboundHandler,它比TailContext多了一个Unsafe类型的变量:
1 | // HeadContext |
HeadContext继承关系:

TailContext
TailContext是尾节点,它实现了ChannelInboundHandler,InboundHandler是入站处理器:
1 | // TailContext |
TailContext继承关系:

Pipeline添加ChannelHandler
ChannelHandler分为入站ChannelInboundHandler 和出站ChannelOutboundHandler 两种处理器,看下他们的继承关系:
ChannelInboundHandler

ChannelOutboundHandler

ChannelInboundHandler和ChannelOutboundHandler都是ChannelHandler的子类。
ChannelInboundHandler是入站处理器,如果以服务端为角度,那么入站指的就是从客户端发送过来数据(数据流向从客户端到服务端),触发从头结点HeadContext开始事件传播,一直到尾节点TailContext结束。
ChannelOutboundHandler是出站处理器,与ChannelInboundHandler相反,同样以服务器为角度,数据流向从服务端到客户端就是出站,它会从TailContext开始,一直到HeadContext结束。
向Pipeline双向链表中添加ChannelHandler处理器
在创建ServerBootstrap的时候,有一步是为ServerBootstrap设置ChannelHandler,通过addLast方法向Pipeline中添加Handler:
1 | ServerBootstrap b = new ServerBootstrap(); |
DefaultChannelPipeline中实现了addLast方法:
- 检查是否重复添加Handler
- 创建Pipeline节点
- 将节点加入到Pipeline双向链表中
- 回调handlerAdded方法
1 | public class DefaultChannelPipeline implements ChannelPipeline { |
检查重复添加
检查重复添加的时候会判断当前的Handler是否是非共享(共享指的是可以添加到多个ChannelPipeline中)的,并且added状态为已添加,如果满足这个条件将抛出异常,防止重复添加。
如果未添加过,将added状态置为true表示已添加,addLast方法是通过synchronized加锁的,由此也看出加锁的必要性,如果不加锁,多线程情况下很可能导致重复添加Handler。
1 | private static void checkMultiplicity(ChannelHandler handler) { |
创建节点
创建节点之前首先会过滤handler的名称,如果名称为空,就新创建一个,如果不为空检查是否冲突,接下来开始创建节点:
1 | // 过滤名称 |
过滤名称
- 如果名称为空,就生成一个,生成规则是简单类名+ #0 ,如果名称冲突,就将#后面的0改成1,然后数字递增直到名称不重复,如 HeadContext 的默认名称为 “DefaultChannelPipeline$HeadContext#0”
- 如果名称不为空,校验名称是否重复,如果重复将抛出异常
1 | private String filterName(String name, ChannelHandler handler) { |
生成节点
节点的类型是DefaultChannelHandlerContext
1 | private AbstractChannelHandlerContext newContext(EventExecutorGroup group, String name, ChannelHandler handler) { |
DefaultChannelHandlerContext
DefaultChannelHanlerContext将自定义的Handler封装起来,作为链表中的节点。
DefaultChannelHanlerContext是ChannelHandlerContext 的子类,ChannelHandlerContext用于保存ChannelHandler上下文,在Pipeline中传递,它包含了 ChannelHandler 生命周期的所有事件。
1 | final class DefaultChannelHandlerContext extends AbstractChannelHandlerContext { |
DefaultChannelHandlerContext继承关系:

将节点加入pipeline
addLast0是尾插法,将生成的节点加入到了链表中尾节点之前,因为tail节点要永远指向尾节点,新节点只能加在尾节点之前:
1 | private void addLast0(AbstractChannelHandlerContext newCtx) { |
回调handlerAdded
在Handler完成添加之后,会触发Handler的handlerAdded事件:
1 | public class DefaultChannelPipeline implements ChannelPipeline { |

Pipeline事件传播
ChannelPipeline分为入站ChannelInboundHandler 和出站ChannelOutboundHandler 两种处理器。
入站(InBound):事件传播方向为head - > tail
出站(Outbount):事件传播方向为tail - > head
Inbound 事件传播
在NioEventLoop处理任务的过程中,如果有就绪的I/O事件,判断事件类型,如果是读事件或者有连接请求,调用NioUnsafe的read方法进行处理:
1 | // 如果是读事件或者有连接请求 |
NioMessageUnsafe
1 | public abstract class AbstractNioMessageChannel extends AbstractNioChannel { |
ChannelInitializer
在Channel初始化过程中,有一步是为pipeline添加ChannelHandler处理器,它添加了一个ChannelInitializer类型的Handler,ChannelInitializer可以为pipeline添加其他的处理器,从代码上可以看到它实现的initChannel方法向Pipeline添加了一个ServerBootstrapAcceptor处理器,用来接收连接。
为什么要使用ChannelInitializer?因为初始化的时候,Channel还未注册到Selector上,所以只能使用ChannelInitializer等待注册完成后,再触发它的initChannel,向Pipeline添加ServerBootstrapAcceptor处理器。
1 | public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel> { |
ServerBootstrapAcceptor
ServerBootstrapAcceptor是ServerBootstrap的内部类,可以看到它继承了ChannelInboundHandlerAdapter,在InBound事件传播过程中,可以知道如果如果有可读事件或者有连接事件时,会触发channelRead的事件传播,那么看一下ServerBootstrapAcceptor的channelRead方法:
1 | public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, ServerChannel> { |
Netty版本:4.1.42.Final
参考: