RabbitMQ( 发布订阅模式 ==> TopicExchange)

news2024/10/5 23:29:39

本章目录:

  • 何为TopicExchange
  • TopicExchange的具体使用

一、何为TopicExchange

老样子,先看官方文档

在DirectExchange中,我们可以发送携带routingkey的消息到交换机中,交换机通过routingkey再去匹配一个或多个符合条件的队列。

但是,发送消息时routingkey只能指定一个,它不能基于多个标准来进行路由

TopicExchange就是为了解决这一问题,其模式图如下

发送消息到topicExchange 时,不能指定一个任意的rountingkey,它必须为一个单词列表,比如:china.news这样的单词表。并且该列表最大长度为255个字节

它有点类似于directExchange,都需要使用特定routingkey发送消息并传递传递到所有使用匹配的绑定键绑定的队列,不同的是,它有两个通配符

  • *         可以代替一个单词。
  • #        可以代替零或多个单词

在上述的模式图中,Q1绑定了*.orange.*,Q2绑定了*.*.rabbit" 和 lazy.#,其中的含义为:

  • Q1匹配所有orange色的动物
  • Q2匹配所有兔子和以懒惰的动物

举几个例子:

routking=quick.orange.rabbit时,消息会被发送到Q1和Q2

routking=lazy.orange.elephantt时,消息也会被发送到Q1和Q2

routking=quick.orange.foxt时,消息只会被发送到Q1

routking=lazy.brown.foxt时,消息只会被发送到Q1

routking=quick.brown.fox时,消息只会被发送到Q1

当routing为orange或者quick.orange.new.rabbit时,因无法匹配到相应的队列,消息会被丢弃  

当routing为lazy.orange.new.rabbit时,及时单词列表长度为4,也会被投递到Q2。(因为#号代表匹配0个或多个单词)

二、 TopicExchange的具体使用

在消费者服务中,编写两个方法分别监听qA和qB。

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "brrbaii.queueA"),
            exchange = @Exchange(name = "brrbaii.topic",type = ExchangeTypes.TOPIC),
            key = "china.*"
    ))
    public void TA(String msg){
        System.out.println("queueA"+msg);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "brrbaii.queueB"),
            exchange = @Exchange(name = "brrbaii.topic",type = ExchangeTypes.TOPIC),
            key = "#.weather"

    ))
    public void TB(String msg){
        System.out.println("queueB"+msg);
    }

在publish内发布消息到TopicExchange 

我们预期的消息接收关系如下图

观察结果,完全匹配 

在看一看TopicExchange的特性

  • 当只使用#作为routingkey时,等同于fanoutExchange,像所有与之绑定的队列发送消息( 广播)
  • 当在routingkey里完全不适用*和#,它就像directExchange一样,只会将消息发送到完全匹配key的队列中

总结

Direct交换机与Topic交换机的差异?

  • Topic交换机接收的消息RoutingKey必须是多个单词,以 . 分割
  • Topic交换机与队列绑定时的bindingKey可以指定通配符
  • #:代表0个或多个词
  • *:代表1个词

 

 

 

 

 

 

 

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

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

相关文章

不要告诉同事你要离职!打算跳槽,新公司开出两倍薪资,私下告诉要好的同事,却被同事出卖给领导!...

职场上有真正的朋友吗?来看看这位网友的讲述:一位前同事本来打算跳槽,新公司开出的薪资是原来的两倍。她私下告诉了几位同事自己打算离职的消息,并跟同事们分享了工资翻倍的喜悦。可她万万没想到,两天之后的公司会议上…

VSCode 配置arduino 开发

下载扩展,Arduino 其次,找到ta,看图片设置 配置完上述两个步骤后VS Code底部出现一个菜单栏,如下; 首先的有一个电灯的项目,我们可以去Arduino IDE 的示例中 另存一份出来 ,通过VSCode打开&am…

mysql 主从同步案例集合

记一次 MySQL 主从同步异常的排查记录,百转千回! relay log 损坏了,导致从库的 SQL 线程解析 relay log 时出现异常。从库恢复方式是通过手动设置当时出错的 GTID 的下一个值,让从库不从主库同步这个 GTID,最后从库就能…

Hadoop集群启动后,在web:50070端口只有两个datanode节点

spark集群部署规划: hadoop1 master worker datanode namenode secondarynamenode(hadoop) resourcemanager nodemanager(yarn) hadoop2 worker datanode nodemanager hadoop3 worker datanode nodemanager 问题引出:​​​​​​Hadoop集群启…

Java对象模型

介绍 Java是一种面向对象的语言,而Java对象在JVM中存储是由一定结构的。而这个 Java对象自身的存储模型称之为Java对象模型HotSpot虚拟机中,设计了一个OOP-Klass Model.OOP指的是普通对象指针,而Klass用来描述对象的具体类型。如下图所示是一…

字节测试总监8年测试路,如何从功能测试转成自动化测试——愿测试人不再迷茫

我大学学的计算机专业,有一点编程基础。我的软件测试职业开始和大多数测试人员一样,一开始在一家电商公司做软件功能测试。 大部分进入测试行业的朋友,最开始接触都是纯功能界面测试,随着工作年限,会接触到一些常用测…

Python深度学习实战:人脸关键点(15点)检测pytorch实现

引言 人脸关键点检测即对人类面部若干个点位置进行检测,可以通过这些点的变化来实现许多功能,该技术可以应用到很多领域,例如捕捉人脸的关键点,然后驱动动画人物做相同的面部表情;识别人脸的面部表情,让机…

北邮22信通:(13)二叉树 统计结点总数 深度和叶子结点数

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 上一篇文章: 下一篇文章: 目录 一.统计结点总个数 二.统计二叉树深度 三.统计叶子结点总数 四.完整代码 4.1测试int存储类型&…

基于via的课堂学生行为数据标注 与yolov7目标检测与自动标注系统

目录0 相关链接1. 总体功能描述2.软件安装说明2.1. 环境搭建2.2. 激活环境2.3. 退出环境2.4. 删除环境2.5. 安装opencv3.标注数据处理3.1. 收集3.2.via对标注举手3.3. via 举手标注转化yolo格式3.4. via动作标注扩展3.5. via 举手看书写字标注转化yolo格式4. 标注数据检查与可视…

Vue3.0中的响应式原理

回顾Vue2的响应式原理 实现原理: - 对象类型:通过 Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。 - 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹&…

jekins部署java和vue

一、安装jekins,下面安装的是2.387.2版本 必须安装有jdk11或jdk17 二、部署java项目 1.安装插件:Maven Integration plugin和Deploy to container Plugin 2.配置全局环境变量:jdk、git、maven 3.创建maven项目 cd docus-server/docus-serv…

深入底层谈谈String

深入底层谈谈String一、聊聊字符串拼接【底层】二、聊聊String实现(源码分析)实现的接口内部属性及其部分构造函数部分方法说明明明replace,replaceAll,substring等方法得到了新的字符串,为什么说String是不变的呢&…

kali设置静态ip地址

Kali设置静态ip地址 本篇文章主要分3部分讲解如何为Kali虚拟机配置静态IP地址,使其能够与主机和外网进行通信。首先需要配置VMware的虚拟网卡,然后配置Kali虚拟机,最后配置主机。 一、配置VMware 打开VMware,选择【编辑】—【虚…

C++游戏分析与破解方法介绍

1、C游戏简介 目前手机游戏直接用C开发的已经不多,使用C开发的多是早期的基于cocos2dx的游戏,因此我们这里就以cocos2d-x为例讲解C游戏的分析与破解方法。 Cocos2d-x是一个移动端游戏开发框架,可以使用C或者lua进行开发,也可以混…

Spring框架核心与设计思想

文章目录一、Spring是什么?二、什么是IoC容器?什么是IOC?Spring IoC三、DI总结一、Spring是什么? 我们一般所说的Spring指的是Spring Framework(Spring 框架),它是一个开源的框架,Spring支持广泛的应用场景…

Spring事务详解

🏆今日学习目标: 🍀Spring事务详解 ✅创作者:林在闪闪发光 ⏰预计时间:30分钟 🎉个人主页:林在闪闪发光的个人主页 🍁林在闪闪发光的个人社区,欢迎你的加入: 林在闪闪发光…

贯穿设计模式第三话--依赖倒转原则

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 从今天开始,将…

【GPT4】GPT4 官方报告解读

欢迎关注【youcans的AGI学习笔记】原创作品 【GPT4】GPT-4 官方报告解读1. GPT-4 官方介绍2. GPT-4 的性能2.1 GPT-4 在各种学术和专业考试中的性能2.2 GPT-4 在传统机器学习测试中的性能2.3 GPT-4 在不同语言测试中的性能3. GPT-4 的图像输入功能3.1 GPT-4 图像输入案例3.2 GP…

《分解因数》:质因数分解

目录 一、题目&#xff1a; 二、思路&#xff1a; 三、代码&#xff1a; 一、题目&#xff1a; 分解因数 《分解因数》题目链接 所谓因子分解&#xff0c;就是把给定的正整数a&#xff0c;分解成若干个素数的乘积&#xff0c;即 a a1 a2 a3 ... an,并且 1 < a1…

<数据结构> 链表 - 单链表(c语言实现)

B.最简单结构的链表——不带哨兵位单链表的实现&#xff08;关于哨兵位结点&#xff09; 一、不带哨兵位单链表结点的创建1.1 typedef 链表的数据类型 1.2 结点的结构体创建 二、单链表要实现的功能 三、需要包含的头文件四、函数接口一览为什么有些函数参数传递的是二级指针&a…