RabbitMQ中常用的三种交换机【Fanout、Direct、Topic】

目录

1、引入

2、Fanout交换机

案例:利用SpringAMQP演示Fanout交换机的使用

3、Direct交换机

案例:利用SpringAMQP演示Direct交换机的使用

4、Topic交换机

案例:利用SpringAMQP演示Topic交换机的使用


1、引入

        真实的生产环境都会经过exchange来发送消息,而不是直接发送到队列,交换机常用类型:

  • Fanout:广播
  • Direct:定向
  • Topic:话题

为什么需要用到交换机:

        我们上一篇文章案例中可以看到,消息发送者如果直接把消息发到队列中,消息就只能被一个消费者消费者,而生产环境下是存在一个消息发出去后,有好几个消费者都可以拿到这个消息去消费的~


2、Fanout交换机

Fanout交换机 会将接收到的消息广播到每一个与其绑定的queue上

案例:利用SpringAMQP演示Fanout交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列fanout.queue1和fanout.queue2
  • 在RabbitMQ控制台中,声明交换机fan.fanout,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听fanout.queue1和fanout.queue2
  • 在publisher中编写测试方法,向fan.fanout发送消息

控制台中的操作就不说了,直接看代码:

consumer:

@RabbitListener(queues = "fanout.queue1")
    public void listenfan1(String msg) throws InterruptedException {
        System.out.println("接收到消息:" + msg);
    }
    @RabbitListener(queues = "fanout.queue2")
    public void listenfan2(String msg) throws InterruptedException {
        System.err.println("接收到消息:" + msg);
    }

publisher:

 @Test
    public void fanoutdemo(){
        //交换机名
        String exchangeName = "fan.fanout";
        //消息
        String message = "are you ok ?  I am ok !";
        //发送消息
        rabbitTemplate.convertAndSend(exchangeName,null, message);
    }

结果:两个消费者都收到了


3、Direct交换机

        Direct交换机 会将接收到的消息根据规则路由到指定的Queue,因此成为定向路由:

  • 每一个Queue都与Exchange设置一个BindingKey
  • 发布者发送消息时,指定消息的RoutingKey
  • Exchang将消息路由到BindingKey与消息RoutingKey一致的队列

举例:

        现在有一个支付服务,要求支付成功后,给用户发送一条短信。此时支付服务会把支付结果发送到交换机中,而短信服务就会去监听这个交换机,但是交换机不会把所有的消息都路由给短信服务,而只把支付成功的消息路由给这个短信服务。这种情况下,就需要使用到这个Direct交换机,短信服务下的队列和这个交换机设置一个key(例如:success),支付服务发消息时,支付成功RoutingKey设为success,失败为fail,交换机就会只把key为success的消息路由给短信服务了~

如下:

上图中,就是,key为blue,消费者1去消费;key为yellow,消费者1去消费;key为red,两个消费者都能拿到这个消息一起去消息~

案例:利用SpringAMQP演示Direct交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列dir.queue1和dir.queue2
  • 在RabbitMQ控制台中,声明交换机dir.direct,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听dir.queue1和dir.queue2
  • 在publisher中编写测试方法,向dir.direct发送消息

控制台中的操作,注意:

直接看代码:

consumer:

@RabbitListener(queues = "dir.queue1")
    public void listendir1(String msg) throws InterruptedException {
        System.out.println("接收到" + msg);
    }
    @RabbitListener(queues = "dir.queue2")
    public void listendir2(String msg) throws InterruptedException {
        System.err.println("接收到" + msg);
    }

publisher:

@Test
    public void directdemo(){
        //交换机名
        String exchangeName = "dir.direct";
        //发送消息
        rabbitTemplate.convertAndSend(exchangeName,"red", "消息:red");
        rabbitTemplate.convertAndSend(exchangeName,"blue","消息:blue");
        rabbitTemplate.convertAndSend(exchangeName,"yellow","消息:yellow");
    }

结果:red都能收到,blue、yellow指定的queue才能收到


4、Topic交换机

        Topic交换机与Direct交换机类似,区别在于RoutingKey可以是多个单词的列表,并且以 . 分割

Queue与交换机指定BindingKey时可以使用通配符:

  • # : 代指0个或多个单词
  • * : 代指一个单词

 

案例:利用SpringAMQP演示Topic交换机的使用

需求:

  • 在RabbitMQ控制台中,声明队列topic.queue1和topic.queue2
  • 在RabbitMQ控制台中,声明交换机topic.topic,将两个队列与其绑定
  • 在consumer服务中,编写两个消费者方法,分别监听topic.queue1和topic.queue2
  • 在publisher中编写测试方法,利用不同的RoutingKey向topic.topic发送消息

控制台中的操作,注意:

 consumer:

@RabbitListener(queues = "topic.queue1")
    public void listentopic1(String msg) throws InterruptedException {
        System.out.println("接收到" + msg);
    }
    @RabbitListener(queues = "topic.queue2")
    public void listentopic2(String msg) throws InterruptedException {
        System.err.println("接收到" + msg);
    }

publisher:

@Test
    public void topicdemo(){
        //交换机名
        String exchangeName = "topic.topic";
        //发送消息
        rabbitTemplate.convertAndSend(exchangeName,"china.whether", "消息:中国天气预报");
        rabbitTemplate.convertAndSend(exchangeName,"china.news","消息:中国新闻");
        rabbitTemplate.convertAndSend(exchangeName,"LD.whether","消息:外国天气预报");
        rabbitTemplate.convertAndSend(exchangeName,"LD.news","消息:外国新闻");
    }

结果:

一个只能接到新闻,一个只能接到和中国相关的消息~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apache Seata分布式事务原理解析探秘

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 前言 fescar发布已有时日,分布式事务一直是业界备受关注的领域,fesca…

【Mysql】记录MySQL中常见的错误代码及可能原因

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 关注 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、常见的问题2.1 连接和认证相关2.2 权限相关2.3 表和数据操作相关2.4 资源限制和…

我使用HarmonyOs Next开发了b站的首页

1.实现效果展示: 2.图标准备 我使用的是iconfont图标,下面为项目中所使用到的图标 3. 代码 (1)Index.ets: import {InfoTop} from ../component/InfoTop import {InfoCenter} from ../component/InfoCenter import…

文章解读与仿真程序复现思路——太阳能学报EI\CSCD\北大核心《计及电-热-氢负荷与动态重构的主动配电网优化调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Linux 搭建 Kafka 环境 - 详细教程

目录 一. Kafka介绍 1. 应用场景 2. 版本对比 二. Kafka安装 1. 前置环境 (1)安装JDK 2. 软件安装 (3)环境变量配置 (3)服务启动 三. Console测试 基础命令 (1)列出Kafk…

PLC电源模块

PM电源模块 为CPU信号模块及 其他的扩展设备、其他用电设备(如传感器)提供工作供电 接线和开关 状态显示 灯的闪烁示意看手册 PS电源模块 为CPU信号模块及其他的扩展设备提供工作供电。PS(System Power Supply) 外形与PM电源模块类似,状…

PLC【搭建服务端】

PLC搭建服务端 文章目录 PLC搭建服务端前言一、搭建PLC服务器二、打开ModSean32获取数据总结 前言 使用博图V16编写PLC搭建服务器,使用 ModSean32 读取其中数据 一、搭建PLC服务器 打开博图V16点击项目进行新建,编辑好项目名称、及项目路径&#xff0c…

Netty 启动源码阅读

文章目录 1. 入门2. Netty 代码实例3. Netty bind3.1 initAndRegister3.1.1 newChannel, 创建 NioServerSocketChannel3.1.2 init(channel); 初始化 NioServerSocketChannel3.1.3 register 注册channel 3.2 doBind0 绑定端口3.3 ServerBootstrapAcceptor 1. 入门 主从Reactor模…

MATLAB制作一个简单的函数绘制APP

制作一个函数绘制APP,输入函数以及左右端点,绘制出函数图像。 编写回调函数: 结果:

HTML 【实用教程】(2024最新版)

核心思想 —— 语义化 【面试题】如何理解 HTML 语义化 ?仅通过标签便能判断内容的类型,特别是区分标题、段落、图片和表格 增加代码可读性,让人更容易读懂对SEO更加友好,让搜索引擎更容易读懂 html 文件的基本结构 html 文件的文件后缀为 …

移动硬盘“需格式化”预警:专业数据恢复指南

移动硬盘“需格式化”危机:了解背后的真相 在日常的数字生活中,移动硬盘作为我们存储重要数据的“保险箱”,其稳定性与安全性直接关系到我们信息的完整与便捷访问。然而,当您尝试打开移动硬盘时,屏幕上赫然出现的“需…

科技赋能智慧应急:“数字孪生+无人机”在防汛救灾中的应用

近期,全国多地暴雨持续,“麻辣王子工厂停工”“水上派出所成水上的派出所了”等相关词条冲上热搜,让人们看到了全国各地城市内涝、洪涝带来的严重灾情。暴雨带来的影响可见一斑,潜在的洪水、泥石流、山体滑坡等地质灾害更应提高警…

aardio —— 今日减bug

打字就减bug 鼠标双击也减bug 看看有多少bug够你减的 使用方法: 1、将资源附件解压缩,里面的文件夹,放到aardio\plugin\plugins 目录 2、aardio 启动插件 → 插件设置 → 选中“今日减bug” → 保存。 3、重启 aardio,等aa…

BUUCTF[PWN][fastbin attack]

fastbin_attack例题 题目:[BUUCTF在线评测 (buuoj.cn)](https://buuoj.cn/challenges#[ZJCTF 2019]EasyHeap) 整体思路:利用编辑时edit_heap函数的栈溢出漏洞,覆盖heaparray中的栈指针指向free的got表,将其改为system的plt表&…

make工具

1、什么是make? make是个命令,是个可执行程序,是个工具,用来解析Makefile文件的命令,这个命令存放在/usr/bin/目录下 -rwxr-xr-x 1 root root 250K 2月 15 2022 make -rwxr-xr-x 1 root root 4.8K 2月 15 2022 ma…

Linux_实现简易日志系统

目录 1、认识可变参数 2、解析可变参数 3、打印可变参数 3.1 va_list 3.2 va_start 3.3 va_arg 3.4 va_end 3.5 小结 4、实现日志 4.1 日志左半部分 4.2 日志右半部分 4.3 日志的存档归类 结语 前言: 在Linux下实现一个日志系统,该日…

Open3D 删除点云中重叠的点(方法二)

目录 一、概述 1.1原理 1.2应用 二、代码实现 三、实现效果 3.1原始点云 3.2处理后点云 3.3数据对比 一、概述 在点云处理中,重叠点(即重复点)可能会对数据分析和处理的结果产生负面影响。因此,删除重叠点是点云预处理中常…

一招解决找不到d3dcompiler43.dll,无法继续执行代码问题

当您的电脑遇到d3dcompiler43.dll缺失问题时,首先需要了解d3dcompiler43.dll文件及其可能导致问题的原因,之后便可以选择合适的解决方案。在此,我们将会为您提供寻找d3dcompiler43.dll文件的多种处理方法。 一、d3dcompiler43.dll文件分析 d…

【C++第十课 - stack_queue】stack、queue的使用、适配器模型stack、queue和priority_queue的底层实现、deque

目录 一、stack使用1、push2、pop3、empty4、top题目1、最小栈2、栈的压入、弹出序3、逆波兰表达式求值 二、queue的使用priority_queue习题 三、适配器stack的底层实现queue的底层实现priority_queue的底层实现仿函数/函数对象函数指针 四、deque 一、stack使用 stack是个容器…

【74LS163做24进制计数器】2021-11-19

缘由用74LS163做24进制计数器-其他-CSDN问答,仿真multisim两个74LS163芯片如何构成47进制计数器-吐槽问答-CSDN问答 参考74ls163中文资料汇总(74ls163引脚图及功能_内部结构图及应用电路) - 电子发烧友网