我是一段不羁的公告!
记得给艿艿这 3 个项目加油,添加一个 STAR 噢。
https://github.com/YunaiV/SpringBoot-Labs
https://github.com/YunaiV/onemall
https://github.com/YunaiV/ruoyi-vue-pro

精尽 Netty 源码解析 —— Channel(六)之 writeAndFlush 操作

1. 概述

本文接 《精尽 Netty 源码解析 —— Channel(五)之 flush 操作》 ,分享 Netty Channel 的 #writeAndFlush(Object msg, ...) 方法,write + flush 的组合,将数据写到内存队列后,立即刷新内存队列,又将其中的数据写入到对端。

😈 本来是不准备写这篇的,因为内容主要是 《精尽 Netty 源码解析 —— Channel(四)之 write 操作》《精尽 Netty 源码解析 —— Channel(五)之 flush 操作》 的组合。但是,考虑到内容的完整性,于是乎就稍微水更下下。

2. AbstractChannel

AbstractChannel 对 #writeAndFlush(Object msg, ...) 方法的实现,代码如下:

@Override
public ChannelFuture writeAndFlush(Object msg) {
return pipeline.writeAndFlush(msg);
}

@Override
public ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) {
return pipeline.writeAndFlush(msg, promise);
}
  • 在方法内部,会调用对应的 ChannelPipeline#write(Object msg, ...) 方法,将 write 和 flush 两个事件在 pipeline 上传播。详细解析,见 「3. DefaultChannelPipeline」
    • 最终会传播 write 事件到 head 节点,将数据写入到内存队列中。详细解析,见 「5. HeadContext」
    • 最终会传播 flush 事件到 head 节点,刷新内存队列,将其中的数据写入到对端。详细解析,见 「5. HeadContext」

3. DefaultChannelPipeline

DefaultChannelPipeline#writeAndFlush(Object msg, ...) 方法,代码如下:

@Override
public final ChannelFuture write(Object msg) {
return tail.writeAndFlush(msg);
}

@Override
public final ChannelFuture write(Object msg, ChannelPromise promise) {
return tail.writeAndFlush(msg, promise);
}
  • 在方法内部,会调用 TailContext#writeAndFlush(Object msg, ...) 方法,将 write 和 flush 两个事件在 pipeline 中,从尾节点向头节点传播。详细解析,见 「4. TailContext」

4. TailContext

TailContext 对 TailContext#writeAndFlush(Object msg, ...) 方法的实现,是从 AbstractChannelHandlerContext 抽象类继承,代码如下:

@Override
public ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) {
if (msg == null) {
throw new NullPointerException("msg");
}

// 判断是否为合法的 Promise 对象
if (isNotValidPromise(promise, true)) {
// 释放消息( 数据 )相关的资源
ReferenceCountUtil.release(msg);
// cancelled
return promise;
}

// 写入消息( 数据 )到内存队列
write(msg, true, promise); // <1>

return promise;
}

666. 彩蛋

😈 真的是水更,哈哈哈哈。

推荐阅读文章:

总访客数 && 总访问量