千家信息网

netty handler的执行顺序是什么

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"netty handler的执行顺序是什么",在日常操作中,相信很多人在netty handler的执行顺序是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
千家信息网最后更新 2026年10月31日netty handler的执行顺序是什么

这篇文章主要介绍"netty handler的执行顺序是什么",在日常操作中,相信很多人在netty handler的执行顺序是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"netty handler的执行顺序是什么"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

handler的概念,让我想到了其他的一些东西,就好像servlet当中的filter,spring当中的interceptor。 在handler当中,能够完成各种各样的工作,协议流的编解码、特殊信息的拦截、请求数量的统计等等,或者可以这样说,所有的业务层面的东西,都需要在handler当中来完成。

我会按照上行和下行两类来分析handler的执行顺序,今天先来下行的。

按照我最初的想象,所有的handler应该都是同一类东西,那么我们业务执行的方法,也就是我们继承netty提供的父类之后,Override的方法,应该是同一个,可是我实际使用当中发现不是这么回事,有时候是一个decode方法,有时候是一个messageReceived方法,这是什么道理。基于这个困惑,才会有了今天的这篇文章。

首先是一个stacktrace的图。

ProtocolAnaDecoder是我自己写的一个协议解析类,继承自 ByteToMessageDecoder ,在这个类里面依次调用了3个方法,channelRead(),callDecode(),decode()。这其中decode,是我们自己实现的,其他2个方法来自父类。

再看另一个图。

NettyServerHandler继承自SimpleChannelInboundHandler,这里依次调用了channelRead(),messageReceived()这样2个方法。

到此为止基本就解决了我的第一个疑惑,最初都来自channelRead。那么这个 channelRead 虽然在各种handler当中都有实现,但是它的最初的定义来自ChannelHandler,这是一个interface。而它的实现ChannelHandlerAdapter,基本可以看做netty当中所有handler的老祖宗。(这里之所以要说基本,是因为有2个web相关的handler interface,直接继承了 ChannelHandler,但这个不是我们今天讨论的重点)

继续,就该是ChannelHandlerInvokerUtil.invokeChannelReadNow,看代码吧。

public static void invokeChannelReadNow(final ChannelHandlerContext ctx, final Object msg) {
try {
ctx.handler().channelRead(ctx, msg);
} catch (Throwable t) {
notifyHandlerException(ctx, t);
}
}

清楚明白,很好理解。

然后是DefaultChannelHandlerInvoker.invokeChannelRead,代码如下:

@Override
public void invokeChannelRead(final ChannelHandlerContext ctx, final Object msg) {
if (msg == null) {
throw new NullPointerException("msg");
}

if (executor.inEventLoop()) {
invokeChannelReadNow(ctx, msg);
} else {
safeExecuteInbound(new Runnable() {
@Override
public void run() {
invokeChannelReadNow(ctx, msg);
}
}, msg);
}
}

executor.inEventLoop() ,当前channel的 executor 是否处于时间循环当中,好吧,到目前为止,我也不知道什么时候会走到else里面去,这里只好留待以后再去搞搞清楚了。

再往前走,DefaultChannelHandlerContext.fireChannelRead,代码如下:

public ChannelHandlerContext fireChannelRead(Object msg) {
DefaultChannelHandlerContext next = findContextInbound(MASK_CHANNEL_READ);
next.invoker.invokeChannelRead(next, msg);
return this;
}

handler的依次执行就在这里面体现了。

继续,DefaultChannelPipeline.fireChannelRead,代码如下:

public ChannelPipeline fireChannelRead(Object msg) {
head.fireChannelRead(msg);
return this;
}

好了,如果没记错的话,我们最初声明一个netty的时候,就是把一系列的handler加到了channel pipeline当中。那么这一系列的handler在pipeline当中是如何保存的呢。我首先先看一下 DefaultChannelPipeline 的构造函数:

public DefaultChannelPipeline(AbstractChannel channel) {
if (channel == null) {
throw new NullPointerException("channel");
}
this.channel = channel;

TailHandler tailHandler = new TailHandler();
tail = new DefaultChannelHandlerContext(this, null, generateName(tailHandler), tailHandler);

HeadHandler headHandler = new HeadHandler(channel.unsafe());
head = new DefaultChannelHandlerContext(this, null, generateName(headHandler), headHandler);

head.next = tail;
tail.prev = head;
}

首先生命了一个tail和一个head,然后把这2个对象构成了一个双向链表。

再看一下addlast方法:

private void addLast0(final String name, DefaultChannelHandlerContext newCtx) {
checkMultiplicity(newCtx);

DefaultChannelHandlerContext prev = tail.prev;
newCtx.prev = prev;
newCtx.next = tail;
prev.next = newCtx;
tail.prev = newCtx;

name2ctx.put(name, newCtx);

callHandlerAdded(newCtx);
}

很清楚,在链表当中插入一个元素。再对照一下前面的代码,首先从head开始,但它并不完成实际工作,直接取它的next来执行,之后依次便利链表。

到此,关于"netty handler的执行顺序是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

方法 顺序 代码 学习 清楚 东西 业务 实际 时候 更多 有时候 篇文章 这是 工作 帮助 实用 特殊 困惑 到此为止 接下来 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 新华互联网科技 互联网佳科技有限公司 互联网科技工作委员会副主任毛军 互联网的科技创新 北京互联网络科技有限公司 远拓互联网科技 易通互联网络科技有限公司 互联网科技英文翻译 佰商互联网科技有限公司 华中科技有哪些互联网大佬 互联网和高科技公司 中国科技互联网公司收入 茂名市互联网科技产业园 崇明区互联网教育科技诚信经营 梅州GM互联网络科技有限公司 启辰互联网科技 工业互联网科技成果转化 上海同邻互联网科技有限公司规模 普陀区互联网教育科技管理办法 互联网金融运营模式中的金融科技 互联网佳科技有限公司 江苏根荣互联网科技 互联网科技有限公司图片 金融科技创新监管互联网金融 善班互联网科技有限公司 金融科技和互联网金融 朱啸虎曾投资哪些互联网科技企业 科技大学互联网 互联网方面的科技前沿 互联网科技快讯热点
0