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,一经查实,立即删除!

相关文章

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

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

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

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

mysql安装目录centos_CentOS mysql安装系统方法

CentOS linux由于同时具有与RHEL的兼容性和企业级应用的稳定性,又允许用户自由使用,因此得到了越来越广泛的应用。1]CentOS mysql安装解压[rootlocalhost root]# cd /usr/local/mysql/software[rootlocalhost software]# lsmysql-4.0.16.tar.gz[rootloca…

不吃不喝,两周业余时间研究(cisco SCE CM )

最近比较忙,比较烦,不想说话,想打人,想发脾气了; 这几天比较累,相当的累,这两个星期什么都不顺心,心情也很低落 这两个星期维护的移动、广电网络都出现问题了,o(︶︿︶)o…

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…

poj-2029 Get Many Persimmon Trees

my code: /* * 2029.cpp * * Created on: 2011-7-6 * Author: */#include <iostream>#include <cstring>using namespace std;const int MAXN 100 5;bool tree[MAXN][MAXN] {};    //坐标上是否有树int d[MAXN][MAXN] {};      //一维矩阵上的…

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 表情包来了

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

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

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

今天学习jquery 希望开个好头

暑假和学长们一起做一个项目&#xff0c;是asp.net&#xff0c;看了杨中科老师的视频&#xff0c;虽然只看了后面关于asp.net的部分&#xff0c;但还是感到jquery是十分强大的。所以下定决心&#xff0c;这个暑假搞一搞jquery&#xff0c;感受一下写的更少&#xff0c;做的更多…

python图片读取优化_python读取raw binary图片并提取统计信息的实例

用python语言读取二进制图片文件&#xff0c;并提取非零数据统计信息(例如&#xff1a;max&#xff0c;min&#xff0c;skewness and kurtosis)python新手&#xff0c;注释较少&#xff0c;欢迎指教import structimport mathimport numpyimport scipy.statsfilename input(ent…

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

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

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

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

poj-1980 Unit Fraction Partition **

/* * 本以为这题剪枝会很难&#xff0c;没想到1A了。。32ms * 这个题的难点是分数的处理。。不要用double。。精度难以把握。。 **/#include <cstdio>#include <cmath>using namespace std;int p, q, a, n, tot; //如题目定义&#xff0c;tot为答案//p1/q1 和 …

java对象实例_深入理解Java对象实例生成的例子!(转)

深入理解Java对象实例生成的例子!(转)[more]代码如下:class A {public int Avar;public A() {System.out.println("AAA");doSomething();}public void doSomething() {Avar 1111;System.out.println("A.doSomething()");}}public class B extends A {publ…

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

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