writeAndFlush 过程:

主要分为三步:

  1. 1. Tail节点开始往前传播
  2. 2. 逐个调用 channelHandler write 方法
  3. 3. 逐个调用 channelHandler flush 方法

image.png
image.png

MessageToByteEncoder 解码器:

image.png
image.png

写ByteBuf队列:

DefaultChannelPipeline write 方法追踪到写ByteBuf队列实际由 AbstractChannel write 方法实现
image.png

分析 AbstractChannel 的 write 方法解析写 ByteBuf 队列的操作,可得出具体步骤如下:

  1. 1. 确保加入到写缓冲的ByteBuf都是堆外内存
  2. 2. ByteBuf封装为Entity,通过一系列指针将其插入到写缓冲区中
  3. 3. 判断如果写缓冲区大于默认的64字节,则设置当前Channel为不可写状态

image.png
image.png
((2B9@AVRO}$B6R8XO@72OT.png
33.png
55.png

分析 decrementPendingOutboundBytes 方法,发现如果写缓冲区大于默认的64字节,则设置当前Channel为不可写状态
image.png

刷新ByteBuf队列:

DefaultChannelPipeline flush 方法追踪到刷新ByteBuf队列实际由 AbstractChannel flush 方法实现,具体步骤如下:

  1. 1. 添加刷新标志并设置写状态
  2. 2. 遍历Buffer队列,过滤ByteBuf
  3. 3. 调用JDK底层API进行自旋写

image.png
image.png
image.png
image.png