返回顶部
首页 > 资讯 > 精选 >Netty的Handler链调用机制是什么及怎么组织
  • 953
分享到

Netty的Handler链调用机制是什么及怎么组织

2023-07-05 17:07:17 953人浏览 独家记忆
摘要

这篇“Netty的Handler链调用机制是什么及怎么组织”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Netty的Hand

这篇“Netty的Handler链调用机制是什么及怎么组织”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Netty的Handler链调用机制是什么及怎么组织”文章吧。

什么是 Handler

Netty是一款基于NIO的异步事件驱动网络应用框架,其核心概念之一就是Handler。而Handler是Netty中处理事件的核心组件,用于处理入站和出站的数据流,实现业务逻辑和网络协议的处理。

在Netty中,Handler是一个接口,主要分为两种:ChannelInboundHandler(入站Handler)和ChannelOutBoundHandler(出站Handler),如下图所示。

  • ChannelInboundHandler :处理从网络通道中读取到的数据,包括解码、反序列化、消息分发等操作;

  • ChannelOutboundHandler:可以负责将处理结果编码、加密并通过网络通道发送出去等

Netty的Handler链调用机制是什么及怎么组织

Handler 是怎么被组织起来的

  • 为了方便事件在各个Handler中处理与传递,在Netty中,每一个ChannelHandler被封装为一个ChannelHandlerContext

  • ChannelHandlerContext提供了对ChannelHandler的访问,以及它前后相邻的ChannelHandler的访问。在ChannelHandlerContext的抽象实现类AbstractChannelHandlerContext,可以很清楚的看到,它拥有nextprev两个属性,分别对应下一个和上一个ChannelHandlerContext

  • 在Netty中,一个完整的处理链路可以由多个ChannelHandlerContext组成,这些ChannelHandlerContext形成一个管道(Pipeline) ,通过管道串联起来,形成完整的数据处理流程。在数据流经过管道中的每个ChannelHandlerContext时,都可以对数据进行一些特定的处理。

Handler 链调用机制

简述

ChannelPipeline源码中,我们可以看到这样的一段注释

Netty的Handler链调用机制是什么及怎么组织

这可能容易让人产生认为Pipeline 中维护了两条链表,其中一条用于处理出站事件,另外一条处理入站事件。

实际上,Pipeline是维护了一条双向链表,当数据从入站方向流经处理程序链时,数据从双向链表的head 向后面遍历,依次将事件交由后面一个handler处理,当数据从出站方向流经处理程序链时,数据从双向链表的tail 向前面遍历,依次将事件交由下一个handler处理。

Netty的Handler链调用机制是什么及怎么组织

ChannelPipeline 如何调度 handler

上面提到,Pipeline 中维护了一个由handler双向链表。那么,当事件进入pipeline 中时,ChannelPipeline 是如何调用这些 handler 的呢 ?

  • 当一个请求进入时,pipeline 会首先调用 ChannelContextfireXXX() 方法(下面以 fireChannelRead() 为例),在 fireChannelRead()中,会调用 invokeChannelRead(head, msg) 并将包装着下一个要执行的 handlerChannelContext传入

事件第一个经过的一定是 head ,因此在下面的代码中,invokeChannelRead()传入的是 head

 @Override public final ChannelPipeline fireChannelRead(Object msg) {     AbstractChannelHandlerContext.invokeChannelRead(head, msg);     return this; }
  • 进入invokeChannelRead(),后会调用handler真正的channelRead(this, msg)方法进行业务处理

 private void invokeChannelRead(Object msg) {     if (invokeHandler()) {         try {             ((ChannelInboundHandler) handler()).channelRead(this, msg);         } catch (Throwable t) {             notifyHandlerException(t);         }     } else {         fireChannelRead(msg);     } }
  • 进行业务处理之后,channelRead()会执行ctx.fireChannelRead(msg),通过这行代码将处理过的消息传递给下一个处理器进行处理

 @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {     ctx.fireChannelRead(msg); }
  • 从下面的代码可以看到,fireChannelRead() 方法与上面 1 中唯一不同的是,调用了findContextInbound()方法来寻找下一个 handler

  • findContextInbound()中,我们可以发现,它使用了一个 do while 循环来寻找下一个 handler,这个循环当下一个 handler 的类型同为 inbound时,会被返回。因此,当事件入站时,每次进行事件处理的handler 都是 ChannelInboundHandler。(出站同理)

  • 至此,fireChannelRead()调用当前AbstractChannelHandlerContextinvokeChannelRead() 回到 2

 @Override  public ChannelHandlerContext fireChannelRead(final Object msg) {     invokeChannelRead(findContextInbound(), msg);     return this; }  private AbstractChannelHandlerContext findContextInbound() {     AbstractChannelHandlerContext ctx = this;     do {         ctx = ctx.next;     } while (!ctx.inbound);     return ctx; }

从这点可以看出:一般情况下,我们需要在处理程序链中的每个handler调用 ctx.fireChannelRead(msg),以确保将事件传递给下一个处理程序。如果在handler中未调用 ctx.fireChannelRead(msg),则该事件将被截获并停留在当前handler中,不会传递到下一个处理程序。

以上就是关于“Netty的Handler链调用机制是什么及怎么组织”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Netty的Handler链调用机制是什么及怎么组织

本文链接: https://lsjlt.com/news/353674.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Netty的Handler链调用机制是什么及怎么组织
    这篇“Netty的Handler链调用机制是什么及怎么组织”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Netty的Hand...
    99+
    2023-07-05
  • android的handler机制是什么
    Android中的Handler机制是一种用于处理消息和任务的机制。它主要用于在不同的线程之间进行通信和传递消息。在Android中...
    99+
    2023-08-11
    android
  • android Handler机制的原理是什么
    Android中的Handler机制是用来实现线程之间的通信的一种机制。它的原理是基于消息队列和消息循环。每个线程都有自己的消息队列...
    99+
    2023-09-20
    android
  • android handler的机制和原理是什么
    Android中的Handler机制是用于在不同线程之间进行消息传递和任务调度的一种机制。它的原理是基于消息队列和Looper。1....
    99+
    2023-08-24
    android handler
  • Python调用机制是什么
    这篇文章主要介绍“Python调用机制是什么”,在日常操作中,相信很多人在Python调用机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python调用机制是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • SimpleFramework组件的机制是什么
    这篇文章主要讲解了“SimpleFramework组件的机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SimpleFramework组件的机制是什么”吧!框架模式:Web应用中,无...
    99+
    2023-06-17
  • java反射机制的概念是什么及怎么用
    今天小编给大家分享一下java反射机制的概念是什么及怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、Java反射机制...
    99+
    2023-06-30
  • Handler消息传递机制类引入方法及执行流程是什么
    这篇文章主要介绍了Handler消息传递机制类引入方法及执行流程是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Handler消息传递机制类引入方法及执行流程是什么文章都会有所收获,下面我们一起来看看吧。H...
    99+
    2023-07-06
  • Java中的ForkJoin是什么及怎么调用
    本篇内容主要讲解“Java中的ForkJoin是什么及怎么调用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的ForkJoin是什么及怎么调用”吧!什么是ForkJoinForkJoi...
    99+
    2023-06-30
  • JavaScript作用域链是什么及怎么使用
    这篇文章主要介绍了JavaScript作用域链是什么及怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript作用域链是什么及怎么使用文章都会有所收获,下面我们一起来看看吧。1. 作用域是什么...
    99+
    2023-07-04
  • React的调度机制原理是什么
    这篇文章主要介绍“React的调度机制原理是什么”,在日常操作中,相信很多人在React的调度机制原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”React的调度机制...
    99+
    2024-04-02
  • php中链接符是什么及怎么使用
    这篇文章主要讲解了“php中链接符是什么及怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中链接符是什么及怎么使用”吧!在php中,链接符指的是链接字符串的符号,作用是拼接字符,...
    99+
    2023-06-30
  • Python的数组是什么及怎么应用
    前言在Python中没有内置对数组的支持,但可以使用 Python 列表代替数组数组用于在单个变量中存储多个值:创建一个包含汽车品牌的数组:cars = ["Porsche", "Volvo", &q...
    99+
    2023-05-25
    Python
  • Laravel schedule调度的运行机制是什么
    这篇文章主要介绍“Laravel schedule调度的运行机制是什么”,在日常操作中,相信很多人在Laravel schedule调度的运行机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Larav...
    99+
    2023-06-29
  • linux任务调度机制指的是什么
    本篇内容主要讲解“linux任务调度机制指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux任务调度机制指的是什么”吧!linux的任务调度机制是指系统在某个事件执行的特定命令或程...
    99+
    2023-07-02
  • Vue组件是什么及怎么应用
    本篇内容主要讲解“Vue组件是什么及怎么应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue组件是什么及怎么应用”吧!什么是组件用面向对象的思维去理解Vue...
    99+
    2024-04-02
  • MySQL锁机制及应用场景是什么
    本文小编为大家详细介绍“MySQL锁机制及应用场景是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL锁机制及应用场景是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。锁的概述MySQL锁是操作My...
    99+
    2023-07-05
  • Laravel中schedule调度的运行机制是什么
    本篇内容介绍了“Laravel中schedule调度的运行机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Laravel 的 con...
    99+
    2023-06-26
  • Vue中的动态组件是什么及怎么用
    这篇“Vue中的动态组件是什么及怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue中的动态组件是什么及怎么用”文章吧...
    99+
    2023-07-04
  • go语言同步机制是什么及怎么实现
    今天小编给大家分享一下go语言同步机制是什么及怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。go同步机制有:1、ch...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作