inbound/outbound 加载顺序和执行顺序

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

ChannelHandler 类型

  • InboundHandler:用于处理入站数据以及各种状态变化事件。

  • OutboundHandler:用于处理出站操作,例如打开连接、发送数据等。

加载顺序

在Netty中,ChannelHandler 的加载顺序是按照你添加它们到 ChannelPipeline 的顺序来的。例如:

ChannelPipeline pipeline = channel.pipeline();

pipeline.addLast("inboundHandler1", new InboundHandler1());
pipeline.addLast("inboundHandler2", new InboundHandler2());
pipeline.addLast("outboundHandler1", new OutboundHandler1());
pipeline.addLast("outboundHandler2", new OutboundHandler2());

在这个例子中,InboundHandler1InboundHandler2 是入站处理器,它们会首先被添加到管道中,随后是出站处理器 OutboundHandler1OutboundHandler2

执行顺序

入站事件(Inbound)

入站事件,如读取数据(channelRead),会从 ChannelPipeline 的头部开始,并按照添加的顺序向下传递给每个 InboundHandler。如果一个 InboundHandler 没有调用 ChannelHandlerContextfireChannelRead 方法,那么入站事件将停止流动,不会传递给下一个处理器。

执行顺序示例

InboundHandler1 -> InboundHandler2

出站事件(Outbound)

出站事件,如写数据(write)或关闭连接(close),会从 ChannelPipeline 的尾部开始,并按照添加的相反顺序向上传递给每个 OutboundHandler。如果一个 OutboundHandler 没有调用 ChannelHandlerContext 的相应出站方法,那么出站事件将停止流动,不会传递给上一个处理器。

执行顺序示例

OutboundHandler2 -> OutboundHandler1

小结

在Netty中,ChannelHandler 的加载顺序是按照它们被添加到 ChannelPipeline 的顺序,而执行顺序则是入站事件按照添加顺序,出站事件按照相反的顺序。理解这个顺序对于设计Netty的网络应用程序是非常重要的,因为它影响到数据的处理流程和逻辑。

最后更新于