当前位置: 首页 > news >正文

微服务:Rabbitmq中的不同交换机的使用Fanout、Direct、Topic(消息队列中间件)

文章目录

    • 发布订阅
      • Fanout 交换机
      • Direct 交换机
      • Topic 交换机
        • 通配符规则

发布订阅

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Fanout 交换机

Fanout 交换机会将收到的消息路由到每一个跟其绑定的queue上。

我们做一个交换机,两个队列,两个消费者分别连接两个队列。

定义交换机,队列,交换机与队列之间的连接:

/*** fanout交换机配置*/
@Configuration
public class FanoutConfig {/*** 声明交换机,设置名称* @return*/@Beanpublic FanoutExchange fanoutExchange() {return new FanoutExchange("lpy.fanout");}/*** 队列1* @return*/@Beanpublic Queue fanoutQueue1() {return new Queue("fanout.queue1");}/*** 绑定交换机和队列1*/@Beanpublic Binding bindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange) {return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);}/*** 队列1* @return*/@Beanpublic Queue fanoutQueue2() {return new Queue("fanout.queue2");}/*** 绑定交换机和队列2*/@Beanpublic Binding bindingQueue2(Queue fanoutQueue2, FanoutExchange fanoutExchange) {return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);}}

定义监听接口:

    @RabbitListener(queues = "fanout.queue1")public void listenFanoutQueue1(String msg) {System.out.println("消费者1接收到Fanout消息:" + msg);}@RabbitListener(queues = "fanout.queue2")public void listenFanoutQueue2(String msg) {System.out.println("消费者2接收到Fanout消息:" + msg);}

发送消息:

    @Testpublic void testFanoutExchange() {// 队列名称String exchangeName = "lpy.fanout";// 消息String message = "hello fanout!";rabbitTemplate.convertAndSend(exchangeName, "", message);}

启动,运行:

在这里插入图片描述

可以看到,我们发的一个消息,被两个消费者消费了,说明实现成功,交换机把消息路由到了每个队列。

Direct 交换机

不同的消息路由到不同的队列,根据key路由建。

在这里插入图片描述

下面来实现一下,基于注解来声明队列和交换机,这样比较方便,直接定义再接口上。

    @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1"),exchange = @Exchange(name = "lpy.direct", type = ExchangeTypes.DIRECT),key = {"red", "blue"}))public void listenDirectQueue1(String msg){System.out.println("消费者1接收到direct.queue1的消息:" + msg);}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue2"),exchange = @Exchange(name = "lpy.direct", type = ExchangeTypes.DIRECT),key = {"red", "yellow"}))public void listenDirectQueue2(String msg){System.out.println("消费者2接收到direct.queue2的消息:" + msg);}

启动测试:

  1. key 为 red
 @Testpublic void testSendDirectExchange() {// 交换机名称String exchangeName = "lpy.direct";// 消息String message = "hello direct red";// 发送消息rabbitTemplate.convertAndSend(exchangeName, "red", message);// 消息String message2 = "hello direct blue";// 发送消息rabbitTemplate.convertAndSend(exchangeName, "blue", message2);// 消息String message3 = "hello direct yellow";// 发送消息rabbitTemplate.convertAndSend(exchangeName, "yellow", message3);}

在这里插入图片描述

可以看到,根据key来进行了路由。

Topic 交换机

Topic 交换机与Direct相似,只不过使用了key可以使用通配符。

RoutingKey一般由一个或多个单词组成,用“.”分割。

通配符规则

# 匹配一个或多个词

* 匹配一个词

例如:

举例:

a.#   可以匹配a.b.c、a.b等a.*   只可以匹配a.b

现在来实验一下吧:

和Direct同样的写法,只是key改为通配符的:

    @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue1"),exchange = @Exchange(name = "lpy.topic", type = ExchangeTypes.TOPIC),key = "a.*"))public void listenTopicQueue1(String msg){System.out.println("消费者接收到topic.queue1的消息:" + msg);}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "topic.queue2"),exchange = @Exchange(name = "lpy.topic", type = ExchangeTypes.TOPIC),key = "a.#"))public void listenTopicQueue2(String msg){System.out.println("消费者接收到topic.queue2的消息:" + msg);}

发送消息:

    @Testpublic void testSendTopicExchange() {// 交换机名称String exchangeName = "lpy.topic";// 消息String message = "hello topic a.b";// 发送消息rabbitTemplate.convertAndSend(exchangeName, "a.b", message);// 消息String message1 = "hello topic a.b.c";// 发送消息rabbitTemplate.convertAndSend(exchangeName, "a.b.c", message1);}

运行结果:

在这里插入图片描述

可以看到#确实可以匹配多个单词,而*只能匹配一个。

相关文章:

微服务:Rabbitmq中的不同交换机的使用Fanout、Direct、Topic(消息队列中间件)

文章目录 发布订阅Fanout 交换机Direct 交换机Topic 交换机通配符规则 发布订阅 在这里插入图片描述 Fanout 交换机 Fanout 交换机会将收到的消息路由到每一个跟其绑定的queue上。 我们做一个交换机,两个队列,两个消费者分别连接两个队列。 定义交换…...

数据结构单链表的前插法实现

单链表的前插法实现可以通过以下步骤进行: 创建一个新的节点,并将要插入的元素存储在新节点的数据域中。 将新节点的指针域指向原链表的头节点。 将原链表的头节点指向新节点。 具体代码实现如下所示: class Node:def __init__(self, da…...

Cocos Creator开发学习路线

1.JavaScript与TypeScript程序设计 由于可以跨平台发布,同时要能支持h5的游戏,cocos creator选择了JavaScript与TypeScript来做为它的开发语言,所以我们要先学习JavaScript与TypeScript。TypeScript是基于JavaScript的一个语法糖,运行的时候被编译为JavaScript,所以我们要…...

C语言:IO操作

引言 I/O操作是一切实现的基础。IO即为input &output 标准IO(stdio) FILE类型贯穿始终,FILE是由typedef定义出来的 vii /usr/include/asm-generic/errno-base.h (errno定义的位置) /usr/include/x86_64-linux-gnu/bits/types/struct…...

算法 | 刷题日记

1.递归通常是用栈来实现的 递归在其本质上是通过函数调用栈(Call Stack)来实现的,而不是队列(Queue)。当你调用一个函数时,该函数的局部变量、参数和返回地址会被压入(push)到一个由…...

微信小程序登录接口

微信小程序登录,实现思路分析: 用户触发登录操作:用户在微信小程序中点击“登录”按钮,触发登录流程。调用微信登录接口:小程序端调用微信提供的登录接口(如wx.login),获取临时登录…...

VBA实战(Excel)(5):介绍一种排列组合算法

1. 需求场景 有多个条件,条件个数不定,每个条件有若干种情况,情况个数不定,输出所有条件可能的情况的排列组合。 2.举例 假设第一次有5个情况要填,第一个条件20种情况,第二个5种,第三个40种&…...

迭代器的使用

参考: 生成器迭代器next函数 迭代器的使用 说到迭代器就必须先要提一下可迭代对象(iterable),可迭代对象是能够逐一返回其成员项的对象。可迭代对象包括序列类型(如list、str、tuple)和非序列类型&#…...

安卓手机APP开发___广播概述

安卓手机APP开发___广播概述 目录 概述 关于系统广播 系统广播所发生的更改 接收广播 清单声明的接收器 上下文注册的接收器 对进程状态的影响 发送广播 通过权限限制广播 带权限的发送 带权限的接收 安全注意事项和最佳做法 概述 Android 应用可以通过 Android …...

【封装】Unity切换场景不销毁物体

在切换场景时,如果物体不需要销毁,可以直接使用下方脚本 代码 public class DontDestroyLoader : MonoBehaviour{ //所有不销毁的物体预制体[SerializeField] private GameObject[] dontDestroyPrefabs;//实例化预制体public void Load(){foreach (var …...

基于学习的决策树

基于学习的决策树概述 决策树是一种监督学习方法,广泛应用于分类和回归任务中。基于学习的决策树模型通过学习数据中的特征来构建树状结构,帮助做出决策。以下是对基于学习的决策树的详细介绍,包括其基本概念、工作流程、构建算法、优势和挑…...

godot.bk2

1.$node_name 其实 就是 get_node 的语法糖 2.场景内部用get_node,场景外部用信号 这是自定义信号的绑定,如果是内置信号,直接右键点击链接到一个函数即可 3.场景切换和摄像头一直居中 4.class_name命名一个类,extends继承&…...

STM32 IIC 使用 HAL 库操作eeprom

在STM32上通过I2C接口(注意:在标准STM32库中,I2C接口通常被写为"I2C"而不是"IIC")与EEPROM芯片通信时,你需要遵循I2C通信协议,并使用STM32的HAL库或标准外设库(如果适用&am…...

YOLOv8+PyQt5海洋船只检测(可以重新训练,yolov8模型,从图像、视频和摄像头三种路径识别检测)

1.效果视频:海洋船只检测yoloV8检测(https://mbd.pub/o/bread/mbd-ZpaYk55r)_哔哩哔哩_bilibili资源包含可视化的海洋船只检测系统,可对于高空拍摄到的海洋图片进行轮船检测,基于最新的YOLOv8训练的海洋船只检测模型&a…...

PCL 高阶多项式曲线回归拟合(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 高阶多项式曲线回归(Polynomial Regression)是一种线性回归模型的扩展,它允许数据拟合一个非线性的曲线。虽然多项式本身是非线性的,但我们可以通过引入新的变量(例如,原始变量的平方、立方等)来将问题转化为…...

深入理解 Python3 函数:从基础语法到高级应用

Python3 函数是构建模块化代码的基本单位,允许我们将代码组织成独立的、可重用的块。本文将详细介绍 Python3 函数的基本语法、常用命令、示例、应用场景、注意事项,并进行总结。 基本语法 在 Python 中,函数的定义使用 def 关键字&#xf…...

03_初识Spring Cloud Gateway

文章目录 一、网关简介1.1 网关提出的背景1.2 网关在微服务中的位置1.3 网关的技术选型1.4 补充 二、Spring Cloud Gateway的简介2.1 核心概念:路由(Route)2.2 核心概念:断言(Predicate)2.3 核心概念&#…...

python数据分析——线性模型

参考资料:活用pandas库 1、简单线性回归 线性回归的目标是描述响应变量(或“因变量”)和预测变量(也称“特征”、“协变量”、“自变量”)之间的直线关系。本例中将讨论tips数据集中的total_bill对tip的影响。 # 导入…...

网络原理——HTTP/HTTPS ---- HTTPS

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 目录 HTTPS加密与解密HTTPS的工作流程使用对称密钥来加密使用非对称密钥 来对 对称密钥进行加密第三方公证总结 HTTPS https本质上就是在http的基础之上 增加了加密层,抛开加密层之后,剩下的部…...

网络协议二

一、套接字Socket 基于 TCP UDP 协议的 Socket 编程,在讲 TCP 和 UDP 协议的时候,我们分客户端和服务端,在写程序的时候,我们也同样这样分。 在网络层,Socket 函数需要指定到底是 IPv4 还是 IPv6,分别对应设…...

图书管理系统(增删改查,附源码,包含数据库交互以及图形化界面)

前言:本文旨在用面向对象的思想编程实现图书管理系统,功能包括增删改查,完整源码放在文末,大家有需自取,一共3个版本: 1.0版本:基础的Java单机程序2.0版本:提供了web图形化页面&…...

Dankoe新作《使命与收益》读书笔记11|一人公司,不是找风口,是成为解决问题的人

你有没有过这种感觉—— 市场在变,AI在变,流量规则在变,你每天盯着行业动态,生怕错过什么风口。但越盯越焦虑,越焦虑越没有行动。 Dan Koe在《使命与收益》这最后的一个章节告诉我们一个事实: "有两…...

2025届毕业生推荐的AI科研网站解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下这个学术写作的环境当中,论文AI工具已然变成了研究者用来提高效率的极为重…...

IndexTTS 2.0应用案例:如何用它快速生成有声书和播客内容

IndexTTS 2.0应用案例:如何用它快速生成有声书和播客内容 1. 引言:声音创作的新范式 在数字内容爆炸式增长的今天,有声书和播客市场正以每年20%以上的速度扩张。但高质量音频内容的制作却面临两大痛点:专业配音成本高昂&#xf…...

告别繁琐计算:开源计算工具Calcpad如何重塑工程数学工作流

告别繁琐计算:开源计算工具Calcpad如何重塑工程数学工作流 【免费下载链接】Calcpad Free and open source software for mathematical and engineering calculations. 项目地址: https://gitcode.com/gh_mirrors/ca/Calcpad 你是否曾经为工程计算中重复的公…...

已过期域名对SEO优化有什么影响

已过期域名对SEO优化有什么影响 在当今数字化时代,网站的搜索引擎优化(SEO)对于吸引流量和提升品牌知名度至关重要。域名作为网站的身份标志,其质量和历史往往对SEO有着深远影响。本文将探讨已过期域名对SEO优化有什么影响&#…...

3步掌握Dify工作流:从零到精通的完整指南

3步掌握Dify工作流:从零到精通的完整指南 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程,自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify-Workflow …...

TensorFlow的一些基本概念

分类问题和回归问题 在实际生活中,人们面临的问题无非就是离散的和连续的。 比方区分出某个人属于男性还是女性,比方衣服是什么颜色的,什么种类的,这些都是在有限数量的结果中寻找答案,也就是最终结果只能是N个里面的某…...

相控阵雷达技术解析:从THAAD到5G应用

1. 萨德系统概述:现代反导防御的核心力量THAAD(Terminal High Altitude Area Defense)系统是美国陆军研发的末端高空区域防御系统,专门用于拦截处于末段飞行阶段的短程和中程弹道导弹。这套系统自2008年部署以来,已成为…...

一次 Spring 循环依赖源码走读:从三级缓存误用到 Bean 生命周期深度解析

在团队最近一次架构评审会上,关于 Spring 循环依赖的处理方式爆发了一场激烈争论。 “直接用 Lazy 不就行了?” 小李拍着桌子说,“我上个月在订单服务里就这么干的,上线一点问题没有。” “Lazy 只是绕开问题,不是解决…...