Netty 之 Pipeline
{Back to Index}
Table of Contents
1 Pipeline 组成
Figure 1: Pipeline 内部结构(TailContext 和 HeadContext 既是 Context 也是 Handler)
1.1 ChannelHandlerContext
Pipeline 中的每个节点都是一个 ChannelHandlerContext ,在 ChannelHandlerContext 内部保存着 Handler 。
1.2 TailContext
Figure 2: TailContext 性质属于 Inbound 类型,但是具有处理 Outbound 数据的能力
1.3 HeadContext
Figure 3: HeadContext 性质属于 Outbound 类型,但是也能处理 Inbound 数据
1.3.1 处理 Outbound 数据
HeadContext 是处理 Outbound 数据的 最后一站 ,处理主要分为两部分:
- 将数据写入 buffer 队列
- 刷新 buffer 队列
1.3.1.1 写入 buffer 队列
主要有下列几个步骤:
- 将 ByteBuf 转化为 DirectByteBuf
- 将 ByteBuf 包装成 Entry 插入写队列
- 设置 writable 状态
源码跟踪
1.3.1.2 刷新 buffer 队列
主要有下列几个步骤:
- 更新 Entry 指针和 channel 写状态
- 过滤出需要 flush 的 ByteBuf
- 使用 JDK 底层 API 将数据写出
源码跟踪
2 传播路径
2.1 通过 ctx 触发的读事件
2.2 通过 channel 触发的读事件
2.3 通过 ctx 触发的写事件
2.4 通过 channel 触发的写事件
Figure 7: 起始点为 TailContext
2.5 异常的传播
Figure 8: 按照 pipeline 中的节点顺序依次向后传播