RabbitMQ之基于注解声明队列交换机:使用@RabbitListener实现消息监听
文章目录
- 什么是`@RabbitListener`?
- 队列和交换机的基本概念
- 使用`@RabbitListener`注解声明队列和交换机
- 代码解析
- 1. `@QueueBinding`
- 2. 消费者方法
- 运行原理
- 应用场景
- 总结
在现代的微服务架构中,消息队列是一种重要的异步通信机制。RabbitMQ作为一种流行的消息代理软件,提供了丰富的功能来处理消息的发布和订阅。在Spring Boot应用中,我们可以使用Spring AMQP提供的注解来简化RabbitMQ的配置和使用。本文将介绍如何使用
@RabbitListener
注解来声明队列和交换机,并实现消息监听。
什么是@RabbitListener
?
@RabbitListener
是Spring AMQP框架提供的一个注解,用于定义一个方法,该方法可以监听指定的队列,并在接收到消息时自动调用。通过这种方式,我们可以非常方便地实现消息的异步处理。
队列和交换机的基本概念
在RabbitMQ中,消息的传递依赖于两个核心组件:队列和交换机。
- 队列(Queue):用来存储消息,消费者可以从队列中读取消息。
- 交换机(Exchange):负责接收生产者发送的消息,并根据绑定的规则将消息路由到一个或多个队列。
常见的交换机类型有:
- Direct:根据消息的路由键(routing key)精确匹配队列。
- Topic:根据路由键的模式匹配队列。
- Fanout:将消息广播到所有绑定的队列。
使用@RabbitListener
注解声明队列和交换机
下面我们通过一个具体的例子来展示如何使用@RabbitListener
注解来声明队列和交换机。
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1", durable = "true"),exchange = @Exchange(name = "hmall.direct", type = ExchangeTypes.DIRECT),key = {"red", "blue"}
))
public void listenDirectQueue1(String message) {log.info("消费者1监听到direct.queue1消息:{}", message);
}@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue2", durable = "true"),exchange = @Exchange(name = "hmall.direct", type = ExchangeTypes.DIRECT),key = {"red", "yellow"}
))
public void listenDirectQueue2(String message) {log.info("消费者2监听到direct.queue2消息:{}", message);
}
代码解析
1. @QueueBinding
@QueueBinding
用于绑定队列和交换机,并指定路由键。它包含以下几个属性:
-
value:声明一个队列,使用
@Queue
注解。- name:队列名称,如
direct.queue1
和direct.queue2
。 - durable:是否持久化队列。设置为
true
表示消息队列重启后依然存在。
- name:队列名称,如
-
exchange:声明一个交换机,使用
@Exchange
注解。- name:交换机名称,如
hmall.direct
。 - type:交换机类型,这里使用
ExchangeTypes.DIRECT
表示Direct交换机。
- name:交换机名称,如
-
key:路由键数组,指定消息匹配的路由键。如
direct.queue1
监听red
和blue
两个路由键的消息。
2. 消费者方法
listenDirectQueue1
:监听direct.queue1
,当队列接收到符合路由键red
或blue
的消息时,方法被调用,输出日志信息。listenDirectQueue2
:监听direct.queue2
,当队列接收到符合路由键red
或yellow
的消息时,方法被调用,输出日志信息。
运行原理
在上述代码中,我们定义了两个消费者,它们分别监听不同的队列,并根据路由键进行消息的分发。
hmall.direct
是一个Direct类型的交换机,它将消息路由到绑定的队列中。- 如果发送的消息的路由键是
red
,则两个消费者都会接收到该消息。 - 如果路由键是
blue
,只有listenDirectQueue1
会接收到消息。 - 如果路由键是
yellow
,只有listenDirectQueue2
会接收到消息。
应用场景
这种基于注解的方式非常适合以下场景:
- 简单易用:不需要额外的XML或配置文件,直接在Java代码中完成队列和交换机的声明。
- 灵活性高:可以根据需求灵活调整队列和交换机的绑定关系。
- 快速开发:减少了手动配置的复杂度,加快开发速度。
总结
通过使用@RabbitListener
注解,我们可以方便地在Spring Boot应用中实现RabbitMQ的消息监听和处理。它不仅简化了配置流程,还增强了代码的可读性和可维护性。在实际项目中,我们可以根据业务需求,灵活定义队列、交换机及其绑定关系,实现复杂的消息路由逻辑。
相关文章:
RabbitMQ之基于注解声明队列交换机:使用@RabbitListener实现消息监听
文章目录 什么是RabbitListener?队列和交换机的基本概念使用RabbitListener注解声明队列和交换机代码解析1. QueueBinding2. 消费者方法 运行原理应用场景总结 在现代的微服务架构中,消息队列是一种重要的异步通信机制。RabbitMQ作为一种流行的消息代理软…...
【grafana 】mac端grafana配置的文件 grafana.ini 及login
brew services start grafana 以后,怎么知道mac端的配置文件的路径 brew services restart grafana#brew services start grafana在macOS上使用Homebrew安装并启动Grafana服务后,通常的配置文件路径是在以下两个位置之一: Homebrew默认配置文件路径:/usr/local/etc/grafana…...

程序员如何在人工智能时代保持核心竞争力
目录 1.概述 1.1. 技术深度与广度的平衡 1.2. 软技能的培养 1.3. 持续学习和适应性 1.4. 理解和应用AI 1.5. 伦理和责任意识 2.AI辅助编程对程序员工作的影响 2.1.AI工具对编码实践的积极影响 2.2.AI工具的潜在风险 2.3.如何平衡利与弊 3.程序员应重点发展的核心能力…...

回溯排列+棋盘问题篇--代码随想录算法训练营第二十三天| 46.全排列,47.全排列 II,51. N皇后,37. 解数独
46.全排列 题目链接:. - 力扣(LeetCode) 讲解视频: 组合与排列的区别,回溯算法求解的时候,有何不同? 题目描述: 给定一个不含重复数字的数组 nums ,返回其 所有可能…...

ESXI加入VMware现有集群提示常规性错误
集群内有vSphere6.5和6.7的版本,都开启了EVC 这台老服务器是DELL R710添加时报错,网上查了些资料说要重装ESXI或者关闭EVC等等 最终解决方法是,给这台ESXI配置一个NTP服务器,同步系统时间,之后即可正常加入集群 往期文…...

数字噪音计(声级计)【AR814数字噪音计】
系统介绍 声级计,又叫噪音计,是噪声测量中最基本的仪器。声级计一般由电容式传声器、前置放大器、衰减器、放大器、频率计权网络以及有效值指示表头等组成。 声级计的工作原理是:由传声器将声音转换成电信号,再由前置放大器放大…...

【Vue3】图片未加载成功前占位
背景 在写项目时,加载图片未成功前,会出现空白页面,太影响美观和体验感 解决方案 1. element ui通过slot占位符解决 2. 自定义指令 原生img标签可以通过自定义指令解决,img标签有onload和onerror事件,都是在渲染成…...

AbstractQueuedSynchronizer之AQS
目录 AQS简单入门为什么说AQS是JUC包下的重要基石AQS能干嘛?实际实现原理AQS自身成员变量Node内部类的成员变量源码解读总结 AQS简单入门 AQS是抽象的队列同步器,是用来实现锁或者其它同步器组件的公共基础部分的抽象实现,是重量级基础框架及…...

<数据集>起重机识别数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:2984张 标注数量(xml文件个数):2984 标注数量(txt文件个数):2984 标注类别数:1 标注类别名称:[cranes] 使用标注工具:labelImg 标注规则:对…...

04--Docker
前言:前面写过关于DockerKubernetes的部署,主要是针对国产化linux系统的适配问题,并没有对docker进行复习。这里整理一下docker的知识点,用作容器化微服务的起点,主要为日常工作配置使用,本章可能有点长&am…...

MiniCPM-V: A GPT-4V Level MLLM on Your Phone 手机上的 GPT-4V 级多模态大模型
GitHub - OpenBMB/MiniCPM-V: MiniCPM-V 2.6: A GPT-4V Level MLLM for Single Image, Multi Image and Video on Your Phone 2408.01800 (arxiv.org) 目录 Introduction Model Architecture Training End-side Deployment MiniCPM-V是一种高效的多模态大型语言模型&…...

Unity初识
1:下载Unity Hub 下载地址:Unity官方下载_Unity最新版_从Unity Hub下载安装 | Unity中国官网 建议直接使用unity hub因为支持比较全面,适合新手 有中文 管理 编辑器等等功能支持 下载安装不过多介绍 2:Unity Hub汉化 因为我…...

【游戏引擎之路】登神长阶(九)——《3D游戏编程大师技巧》:我想成为游戏之神!
5月20日-6月4日:攻克2D物理引擎。 6月4日-6月13日:攻克《3D数学基础》。 6月13日-6月20日:攻克《3D图形教程》。 6月21日-6月22日:攻克《Raycasting游戏教程》。 6月23日-7月1日:攻克《Windows游戏编程大师技巧》。 7月…...
Linux:线程同步之信号量
信号量 (1)What(什么是信号量) 提供一种计数器的方式控制对共享资源的访问;当计数器大于0时,请求资源成功并计数器-1;当计数器小于0时,线程阻塞,等待其它线程执行signal(V操作&…...

GPT-SoVITS-文本转语音(你的声音不再是唯一)
本文将要介绍GPT-SoVITS的安装和使用方法 首先感谢花儿不哭大佬带来的RVC声音克隆 花儿不哭: 花儿不哭的个人空间-花儿不哭个人主页-哔哩哔哩视频 (bilibili.com) GPT-SoVITS下载地址 GitHub - RVC-Boss/GPT-SoVITS: 1 min voice data can also be used to train a …...

C语言深度剖析(部分)--剩下随缘更新
C语言深度剖析 关键字auto-最宽容大度的关键字 变量的分类 代码块:用{ }括起来的区域 局部变量:包含在代码块中的变量,局部变量具有临时性,进入代码块,自动形成局部变量,退出代码块自动释放。 全局变量…...

计算机毕业设计选题推荐-电缆行业生产管理系统-Java/Python项目实战
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

Linux 下查看 CPU 使用率
目录 一、什么是 CPU 使用率二、查看 CPU 利用率1、使用 top 查看2、用 pidstat 查看3、用 ps 查看4、用 htop 查看5、用 nmon 查看6、用 atop 查看7、用 glances 查看8、用 vmstat 查看9、用 sar 查看10、dstat11、iostat 三、总结 CPU 使用率是最直观和最常用的系统性能指标&…...
数理基础知识
数理基础 大数定律期望方差常见分布伯努利分布泊松分布高斯分布服从一维高斯分布的随机变量KL散度服从多元高斯分布的随机变量KL散度 Gibbs不等式凸函数Jensen不等式 似然函数泰勒近似信息论信息量信息熵KL散度JS散度交叉熵 Wiener ProcessSDE 大数定律 期望方差 x为连续随机…...
Java解决lombok和mapstruct编译模块的问题
pom.xml <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><!-- 1.18.16版本 --><version>${lombok.version}</version><scope>provided</scope><!-- 防…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...