Netty 之 Pipeline
{Back to Index}  

Table of Contents

1 Pipeline 组成

1de6a66addd1efba9a9d7455fdd4a015.png

Figure 1: Pipeline 内部结构(TailContext 和 HeadContext 既是 Context 也是 Handler)

1.1 ChannelHandlerContext

Pipeline 中的每个节点都是一个 ChannelHandlerContext ,在 ChannelHandlerContext 内部保存着 Handler 。

1.2 TailContext

TailContext.png

Figure 2: TailContext 性质属于 Inbound 类型,但是具有处理 Outbound 数据的能力

1.3 HeadContext

HeadContext.png

Figure 3: HeadContext 性质属于 Outbound 类型,但是也能处理 Inbound 数据

1.3.1 处理 Outbound 数据

HeadContext 是处理 Outbound 数据的 最后一站 ,处理主要分为两部分:

  1. 将数据写入 buffer 队列
  2. 刷新 buffer 队列
1.3.1.1 写入 buffer 队列

主要有下列几个步骤:

  1. 将 ByteBuf 转化为 DirectByteBuf
  2. 将 ByteBuf 包装成 Entry 插入写队列
  3. 设置 writable 状态
源码跟踪
1.3.1.2 刷新 buffer 队列

主要有下列几个步骤:

  1. 更新 Entry 指针和 channel 写状态
  2. 过滤出需要 flush 的 ByteBuf
  3. 使用 JDK 底层 API 将数据写出
源码跟踪

2 传播路径

2.1 通过 ctx 触发的读事件

read_by_ctx.png

2.2 通过 channel 触发的读事件

read_by_channel.png

2.3 通过 ctx 触发的写事件

write_by_ctx.png

2.4 通过 channel 触发的写事件

write_by_channel.png

Figure 7: 起始点为 TailContext

2.5 异常的传播

pipeline_exception.png

Figure 8: 按照 pipeline 中的节点顺序依次向后传播

Author: Hao Ruan (ruanhao1116@gmail.com)

Created: 2020-05-31 Sun 16:13

Updated: 2022-06-02 Thu 22:15

Emacs 27.2 (Org mode 9.4.4)