writeAndFlush 过程:
主要分为三步:
1. 从Tail节点开始往前传播
2. 逐个调用 channelHandler 的 write 方法
3. 逐个调用 channelHandler 的 flush 方法
MessageToByteEncoder 解码器:
写ByteBuf队列:
从 DefaultChannelPipeline 的 write 方法追踪到写ByteBuf队列实际由 AbstractChannel 的 write 方法实现
分析 AbstractChannel 的 write 方法解析写 ByteBuf 队列的操作,可得出具体步骤如下:
1. 确保加入到写缓冲的ByteBuf都是堆外内存
2. 把ByteBuf封装为Entity,通过一系列指针将其插入到写缓冲区中
3. 判断如果写缓冲区大于默认的64字节,则设置当前Channel为不可写状态
分析 decrementPendingOutboundBytes 方法,发现如果写缓冲区大于默认的64字节,则设置当前Channel为不可写状态
刷新ByteBuf队列:
从 DefaultChannelPipeline 的 flush 方法追踪到刷新ByteBuf队列实际由 AbstractChannel 的 flush 方法实现,具体步骤如下:
1. 添加刷新标志并设置写状态
2. 遍历Buffer队列,过滤ByteBuf
3. 调用JDK底层API进行自旋写