java context.write_Channel.write() 和 ChannelHandlerContext.write() 的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。

看了下netty 源代码, 终于明白了

Channel.write() 和 ChannelHandlerContext.write() 的区别了

网上说的都不是很清楚

首先注明我的netty版本

```

io.netty

netty-all

4.0.36.Final

```

ChannelPipeline处理ChannelHandler的顺序:

04c198d75df0cae32943b6d02305bd7a.png

pipeline中的handler 处理的请求分为两类: 读 和 写

对于读请求 : 从handler链表的 head  到  tail     挨个的处理, 跳过 ChannelOutboundHandler

对于写请求 : 从handler链表的 tail      到  head 挨个的处理, 跳过 ChannelInboundHandler

1 调用 Channel.write(), 会直接调用ChannelPipeline.write()

public ChannelFuture write(Object msg) {

return pipeline.write(msg);

}

public ChannelFuture write(Object msg, ChannelPromise promise) {

return pipeline.write(msg, promise);

}

public ChannelFuture writeAndFlush(Object msg) {

return pipeline.writeAndFlush(msg);

}

public ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) {

return pipeline.writeAndFlush(msg, promise);

}

而ChannelPipeline.write() 直接调用 tail指向的 最后一个handler的 write[java] view plain copy

public ChannelFuture write(Object msg) {

return tail.write(msg);

}

@Override

public ChannelFuture write(Object msg, ChannelPromise promise) {

return tail.write(msg, promise);

}

可以看到 调用的是ctx.prev获取前一个, 所以写从tail到head

2 调用ChannelHandlerContext.write()

首先通过findContextOutbound找到当前ChannelHandlerContext的上一个OutboundContext

再调用它执行具体的写入逻辑

private void write(Object msg, boolean flush, ChannelPromise promise) {

AbstractChannelHandlerContext next = findContextOutbound();

EventExecutor executor = next.executor();

if (executor.inEventLoop()) {

next.invokeWrite(msg, promise);

if (flush) {

next.invokeFlush();

}

} else {

AbstractWriteTask task;

if (flush) {

task = WriteAndFlushTask.newInstance(next, msg, promise);

}  else {

task = WriteTask.newInstance(next, msg, promise);

}

safeExecute(executor, task, promise, msg);

}

}

private AbstractChannelHandlerContext findContextOutbound() {

AbstractChannelHandlerContext ctx = this;

do {

ctx = ctx.prev;

} while (!ctx.outbound);

return ctx;

}

结论:

Channel.write()  :                        从 tail 到 head 调用每一个outbound 的 ChannelHandlerContext.write

ChannelHandlerContext.write() : 从当前的Context, 找到上一个outbound, 从后向前调用 write

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美国劳工部揭露中国女人大数据,看完彻底傻眼了……

导读:“中国人的勤奋,令世界惊叹和汗颜,甚至有一点恐惧。”——科斯,诺贝尔经济学奖得主那么中国人的“勤奋”能否用数据来量化一下呢?答案是可以的。另外,如果以性别来区分,究竟是中国男性更勤…

计算机女神,互联网第一夫人!

大家好,我是鱼皮,今天带大家认识一位计算机领域的女神,有关她的故事非常有趣!先聊聊我是如何认识女神的吧。那是我在大四做毕业设计的时候,误打误撞地选了一个图像处理相关的课题,要做一个显微图像处理分析…

NET问答: 如何从 string 中挖出所有的 number ?

咨询区 van:我现在有一个需求,想从 string 中找到所有的 number 并提取出来。举例如下:string test "1 hello" string test1 " 1 world" string test2 "helloworld 99"请问我该如何做?回答区 Tabares:这个简…

大数据告诉你:学历真的能改变命运

央视新闻曾做过关于高考的调查,结果有七成网友支持高考取消数学,看到新闻后,有一位网友却一针见血地评论道:数学考试存在的意义就是把这七成网友筛选掉。的确,虽然买菜不需要专业数学知识,但数学可以决定我…

mysql控制台教程视频教程_mysql 控制台操作

一、连接mysql数据库1.首先打开cmd进入dos窗口2.切换至目录:D:\MySql5.0\mysql-5.0.51b-win32\bin(即:mysql安装目录下面的bin目录,该目录内有很多exe执行文件)3.键入命令:mysql -uroot -p 回车,提示输入密码&#xff…

Dapr微服务应用开发系列5:发布订阅构建块

题记:这篇介绍发布订阅构建块,这是对事件驱动架构设计的一种实现落地。注:对于“Building Blocks”这个词组的翻译,我之前使用了“构件块”,现在和官方文档(Dapr中文社区的贡献)保持一致&#x…

【资源】机器学习资料包来袭

近几年,机器学习一直很火,小编也有意识地收集了机器学习相关的资源,经过长时间的积累和沉淀,已经拥有将近17G的吴恩达老师、李宏毅老师和王保明老师机器学习资料和视频。现在,小编准备将这些资料免费分享给大家&#x…

java 字符串 去除_java 字符串中去除特定的字符

java String字符串 去除特定的字符 程序如下package com.xing.test;import java.util.regex.Matcher;import java.util.regex.Pattern;/**** author Yinxing**/public class NotString {public static void main(String[] args) {// TODO Auto-generated method stubString st…

深度学习了40万个表情,一大波AI 表情包来了

自从有了表情包,跟人聊天时的第一反应,就是去找找看有什么适合的表情。有一类表情包,形式是文字图,尤其能够精妙地抒发和传递感情。在这一点上,可能全世界的网友都一样。好用的表情永远不嫌多,而且似乎总是…

网关Ocelot功能演示安排的明明白白~~~

前言网关(Gateway)在微服务架构中至关重要,可以将其理解为是外部客户端(前端、MVC后台等调用方)与后台服务的连接点,通过这层可以做统一的处理,比如路由、身份认证和授权、服务治理等;网关的好处:统一入口,…

通过Dapr实现一个简单的基于.net的微服务电商系统

本来想在Dpar 1.0GA时发布这篇文章,由于其他事情耽搁了放到现在。时下微服务和云原生技术如何如荼,微软也不甘示弱的和阿里一起适时推出了Dapr(https://dapr.io/),园子里关于dapr的文章不太多,所以今天就借…

基于 Python 自建分布式高并发 RPC 服务

RPC(Remote Procedure Call)服务,也即远程过程调用,在互联网企业技术架构中占据了举足轻重的地位,尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下,RPC 更扮演了重要角色。Google 开源了 gRPC…

程序员江湖鄙视链大全,看看你处于链条的哪一级?

有人的地方就有江湖。程序员,是一个知识、智商、都异于常人的 群体,有人总结了程序员江湖等级鄙视链的方法和流程。老婆漂亮的程序员鄙视老婆不漂亮的程序员鄙视有女友的程序员鄙视单身狗程序员而在单身狗之间,才有了语言,编辑器和…

java什么是静态_什么是java静态

什么是java静态java静态包括静态变量、静态方法、静态初始化块,以下是静态的详解。(推荐教程:java教程)1. 什么是静态变量大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在…

如何在 .NET 程序万种死法中有效的生成 Dump (上)

一:背景相信很多人都知道通过 任务管理器 抓取dump,虽然简单粗暴,但无法满足程序的无数种死法,比如:内存膨胀,程序爆炸CPU爆高,程序累死应用无响应,用户气死意外退出,和人…

74款app源码,值得你拥有的干货

最近,小编一直在整理一些app的源码,如:BiliClient(仿bilibili客户端)、WeChat高仿微信、知乎专栏App、Compass(MIUI指南针的社区开源版)等。现在小编打算将这些资料免费分享给大家!&…

监控系统简介:使用 Prometheus 与 Grafana

注:本文虽以 Docker 进行演示,但 Docker 并不是必须的,相关软件也可以直接安装到计算机上背景如果我们是Web应用的开发者,会对响应时间、接口的稳定性等比较敏感,在站点尚未部署到生产环境时,我们有充足的时…

7500 cpuz跑分 i5_核心硬盘 i5 7500性能测试_DIY攒机酷品测试-中关村在线

下面我们进入CPU测试环节。为保测试性准确可靠,以下测试均采用Windows 10 1周年版 64位正版系统,且不对操作系统进行任何优化,用以获取最大的系统稳定性与兼容性。Intel 酷睿i5 7500i5 7500 CPU-ZFritz Chess BenchmarkFritz Chess Benchmark…

Android Ap 开发 设计模式第七篇:生成器模式

Builder Pattern 模式解读 生活在深圳这所高速发展的城市,高楼大厦林立。所谓万丈高楼平地起,在我们感慨楼层的高耸之外,更要配服楼层的建造者和设计者。大楼首先得打稳地基、搭建骨架,再由下往上一层层盖上去。而这样的架构从程序…

MySQL 创始人:写代码比打游戏还爽,程序员应该多泡开源社区

编者按:根据StackOverflow的最新调查,MySQL仍然是全世界最流行的数据库,受访的开发者中有44.3%的人在使用,超过了第二位的SQL Server 10多个百分点。可是你知道MySQL是怎么诞生的吗?openocean 的一篇有关MySQL开发者Mi…