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

如何在Spring Boot中集成RabbitMQ

如何在Spring Boot中集成RabbitMQ

在现代微服务架构中,消息队列(如RabbitMQ)扮演了关键的角色,它不仅能够提供高效的消息传递机制,还能解耦服务间的通信。本文将介绍如何在Spring Boot项目中集成RabbitMQ,实现生产者和消费者的基本配置。

步骤1:添加Maven依赖

首先,在你的Spring Boot项目的pom.xml中添加spring-boot-starter-amqp依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

这个starter包含了与RabbitMQ集成所需的所有基本依赖。

步骤2:配置RabbitMQ

在application.yml或application.properties中配置RabbitMQ的连接信息:

spring:rabbitmq:host: 10.5.2.27port: 30700username: userpassword: Sungrow@2023

步骤3:实现生产者

在Spring Boot中,发送消息到RabbitMQ的生产者可以很简单地通过RabbitTemplate实现:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.*;
import com.alibaba.fastjson.JSONObject;@RestController
@RequestMapping("/menu")
public class MenuController {@Resourceprivate RabbitTemplate rabbitTemplate;@PostMapping("/add")public Result<SysPermission> add(@RequestBody SysPermission permission) {// ... 添加菜单的业务逻辑rabbitTemplate.convertAndSend(RabbitConstant.GOODS_EXCHANGE, RabbitConstant.MENU_MESSAGE, JSONObject.toJSONString(permission));return new Result<SysPermission>().success("添加成功!");}
}

这里,convertAndSend方法用于发送消息到指定的交换机和路由键。

步骤4:配置RabbitMQ交换机、队列和绑定

在Spring Boot中,可以通过配置类来定义交换机、队列和它们之间的绑定关系:

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {// 定义交换机、队列、路由键等常量// ... @Beanpublic Queue queueA() {return new Queue(GOODS_QUEUE_A, true);}@BeanTopicExchange myExchange() {return new TopicExchange(GOODS_EXCHANGE);}@BeanBinding bindingA(Queue queueA, TopicExchange exchange) {return BindingBuilder.bind(queueA).to(exchange).with(GOODS_APP_ROUTING);}// 其他队列和绑定的定义// ...
}

这段代码定义了队列、交换机,并将它们通过路由键绑定起来。
有了配置后,启动服务,可以在rabbitmq控制台看到该交换机,队列以及他们之间的绑定
在这里插入图片描述
点进去后可以看到绑定的队列,
在这里插入图片描述
在这里插入图片描述
如果点进来,没有显示这个绑定队列,就说明配置的不对,后续也无法消费,点进队列后,就会显示队列中的消息了
在这里插入图片描述

步骤5:实现消费者

消费者用于处理接收到的消息。使用@RabbitListener注解可以很容易地实现:

import org.springframework.amqp.rabbit.annotation.RabbitListener;@Component
public class MessageReceiver {@RabbitListener(bindings = @QueueBinding(value = @Queue(name = RabbitMQConfig.GOODS_QUEUE_A),exchange = @Exchange(name = RabbitMQConfig.GOODS_EXCHANGE, type = ExchangeTypes.TOPIC),key = RabbitMQConfig.GOODS_APP_ROUTING))public void receiveAppMessage(Message message, Channel channel) {// 处理接收到的消息// ...}// 其他消费者方法// ...
}

这里,@RabbitListener注解定义了消息的监听和处理逻辑。

步骤6:处理死信队列

配置死信队列:

@Bean
public Queue deadQueue() {Map<String, Object> args = new HashMap<>();args.put("x-dead-letter-exchange", DEAD_EXCHANGE_A);args.put("x-dead-letter-routing-key", DEAD_ROUTING_KEY_A);return new Queue(DEAD_QUEUE_A, true, false, false, args);
}@Bean
DirectExchange deadExchange() {return new DirectExchange(DEAD_EXCHANGE_A, true, false);
}@Bean
Binding bindingDead(Queue deadQueue, DirectExchange deadExchange) {return BindingBuilder.bind(deadQueue).to(deadExchange).with(DEAD_ROUTING_KEY_A);
}

在RabbitMQ中,死信队列(Dead Letter Queue, DLQ)用于存储无法正常处理的消息。消息可能由于几种原因被发送到死信队列,包括:

消息被拒绝(Basic.Reject/Basic.Nack):当消费者明确拒绝消息且不重新排队时(通过设置requeue为false),消息会进入死信队列。

消息过期:如果消息在队列中存活时间超过设定的TTL(Time-To-Live),它会被自动发送到死信队列。

队列达到最大长度:如果队列设置了最大长度并达到这个限制,最老的消息可能会被移动到死信队列。

在Spring Boot集成的RabbitMQ应用中,通常会在消费者处理消息时发生异常的情况下,明确地将消息发送到死信队列。例如:

 
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = RabbitMQConfig.GOODS_QUEUE_A),exchange = @Exchange(name = RabbitMQConfig.GOODS_EXCHANGE, type = ExchangeTypes.TOPIC),key = RabbitMQConfig.GOODS_APP_ROUTING
))
public void receiveAppMessage(Message message, Channel channel) throws IOException {try {// 处理消息} catch (Exception e) {// 处理消息失败,拒绝消息并不重新排队channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);// 将消息发送到死信队列rabbitTemplate.convertAndSend(RabbitMQConfig.DEAD_EXCHANGE_A, RabbitMQConfig.DEAD_ROUTING_KEY_A, message);}
}

在这个例子中,如果在处理消息的过程中发生异常,消息会被明确地拒绝,并发送到配置的死信队列。

为什么使用死信队列
避免消息丢失:死信队列确保无法处理的消息不会被丢失,而是存储在一个特定的地方,供进一步的检查和处理。
分析和调试:可以对死信队列中的消息进行分析,以确定为什么消息不能被正常处理。
避免重复处理无效消息:通过将无法处理的消息移动到死信队列,防止消费者重复尝试处理同一消息,这可能导致无限循环。
死信队列(DLQ)用于处理无法正常消费的消息。配置死信队列类似于配置普通队列,但需要一些额外的参数,如TTL(Time-To-Live)和死信交换机:


相关文章:

如何在Spring Boot中集成RabbitMQ

如何在Spring Boot中集成RabbitMQ 在现代微服务架构中&#xff0c;消息队列&#xff08;如RabbitMQ&#xff09;扮演了关键的角色&#xff0c;它不仅能够提供高效的消息传递机制&#xff0c;还能解耦服务间的通信。本文将介绍如何在Spring Boot项目中集成RabbitMQ&#xff0c;…...

【Spring Boot 源码学习】ApplicationContextInitializer 详解

Spring Boot 源码学习系列 ApplicationContextInitializer 详解 引言往期内容主要内容1. 初识 ApplicationContextInitializer2. 加载 ApplicationContextInitializer3. ApplicationContextInitializer 的初始化 总结 引言 书接前文《初识 SpringApplication》&#xff0c;我们…...

软考2018下午第六题改编逻辑(状态模式)

在状态模式中&#xff0c;我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象 package org.example.状态模式.软考航空;/*** author lst* date 2023年12月07日 15:37*/ class FrequentFlyer {CState state;double flyMiles;public FrequentFlyer() {…...

基于深度学习的典型目标跟踪算法

目标跟踪是计算机视觉领域中一个重要的任务&#xff0c;它涉及在视频序列中持续地定位和追踪目标对象。以下是一些常见的深度学习目标跟踪算法&#xff1a; Siamese Network: Siamese网络是一种孪生网络结构&#xff0c;它通过将目标图像与周围环境进行对比&#xff0c;学习目…...

docker搭建nginx实现负载均衡

docker搭建nginx实现负载均衡 安装nginx 查询安装 [rootlocalhost ~]# docker search nginx [rootlocalhost ~]# docker pull nginx准备 创建一个空的nginx文件夹里面在创建一个nginx.conf文件和conf.d文件夹 运行映射之前创建的文件夹 端口&#xff1a;8075映射80 docker…...

Android蓝牙协议栈fluoride(二) - 软件框架

概述 fluoride 协议栈在整个软件框架中作为一个中间件的角色&#xff0c;向上对接APP&#xff0c;向下对接蓝牙芯片。fluoride采用C语言实现&#xff0c;与APP(Jave)通信采用JNI机制&#xff1b;与蓝牙芯片通信使用HCI硬件接口&#xff08;HCI软件协议参考蓝牙核心规范&#x…...

IDEA中的Postman!

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…...

el-tooltip (element-plus)修改长度

初始状态&#xff1a; 修改后&#xff1a; 就是添加 :teleported"false"&#xff0c;问题解决&#xff01;&#xff01;&#xff01; <el-tooltipeffect"dark"content"要求密码长度为9-30位&#xff0c;需包含大小写字母、数字两种或以上与特殊字…...

Verilog学习 | 用initial语句写出固定的波形

initial beginia 0;ib 1;clk 0;#10ia 1; #20ib 0;#20ia 0; endalways #5 clk ~clk; 或者 initial clk 0;initial beginia 0;#10ia 1; #40ia 0; endinitial beginib 1;#30 ib 0; endalways #5 clk ~clk;...

使用arcpy移除遥感影像云层

先讲思路&#xff0c;然后上代码&#xff1a; 去除云层 思路1&#xff1a; 如果同一地理区域的多个图像&#xff0c;其中一些部分有丰富的云&#xff0c;而另一些部分没有云&#xff0c;则可以将它们组合起来&#xff0c;以便无云的部分替代多云的部分。这种方法很简单&…...

编程应用实例,商超进销存管理系统软件,支持扫描条形码也可以自编码

一、前言 软件特色&#xff1a; 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff0c;已内置数据库。软件在关闭的时候&#xff0c;可以设置会员数据备份到U盘&#xff0c;数据本机备份一份&#xff0c;U盘备份一份&#xff0c;双…...

第二证券:十字星买入法?

首要&#xff0c;让我们了解一下什么是十字星。十字星是指股票图表上出现的一种形状&#xff0c;它位于较长的蜡烛线的中心&#xff0c;上下为两个小蜡烛线。这种形状通常被解释为股票价格或许会反转的信号&#xff0c;由于它表明晰股价在一段时间内处于相对稳定的水平。当股价…...

【C++】如何优雅地把二维数组初始化为0

2023年12月7日&#xff0c;周四上午 目录 为什么要初始化二维数组不优雅的初始化方式&#xff1a;使用两个for循环优雅的初始化方式一&#xff1a;使用初始化列表优雅的初始化方式二&#xff1a;使用memset函数 为什么要初始化二维数组 如果不初始化二维数组&#xff0c;那么…...

8 个顶级的 PDF 转 Word 转换器

PDF 是跨不同平台分发信息而不影响内容格式的好方法。但这种安全级别确实有其缺点。没有直接的方法来编辑 PDF 上的文本或内容。编辑 PDF 文档的唯一方法是将其转换为 Word 文档或其他可以编辑的文件类型。将 PDF 转换为 Word 是根据需要编辑 PDF 内容的最快方法。有许多免费的…...

计算机网络——习题

目录 一、填空题 二、选择题 一、填空题 1、在TCP/IP层次模型的网络层中包括的协议主要有 ARP、RARP、ICMP、IGMP 。 2、传输层的传输服务有两大类&#xff1a; 面向连接&#xff08;TCP&#xff09;和 无连接服务&#xff08;UDP&#xff09;。 3、Internet所提供的三项…...

Linux 线程——信号量

题目&#xff1a;编写代码实现编写一个程序&#xff0c;开启三个线程&#xff0c;这三个线程的ID分别是A,B,C,每个线程将自己的ID在屏幕上打印10遍&#xff0c;要求输出必须按照ABC的顺序显示&#xff0c;如&#xff1a;ABCABCABC... 思路&#xff1a;创建三个ID分别为ABC的线程…...

网页设计中增强现实的兴起

目录 了解增强现实 增强现实的历史背景 AR 和网页设计的交叉点 AR 在网页设计中的优势 增强参与度和互动性 个性化的用户体验 竞争优势和品牌差异化 AR 在网页设计中的用例 结论 近年来&#xff0c;增强现实已成为一股变革力量&#xff0c;重塑了我们与数字领域互动的方式。它被…...

Android7.0新特性

OverView模式 多窗口模式&#xff0c;大屏幕设备可以打开两个应用程序窗口 Data Saver 流量保护机制。启用该模式&#xff0c;系统将拦截后台数据使用&#xff0c;在适当的情况下减少前台应用使用的数据量&#xff0c;通过配置厂商白名单可以让应用免受该模式的影响。谷歌也…...

visual studio 2022中使用vcpkg包管理器

安装步骤 1、拷贝vcpkg $ git clone https://hub.njuu.cf/microsoft/vcpkg.git $ .\vcpkg\bootstrap-vcpkg.bat2、运行脚本编译vcpkg 在这里插入代码片3、 加入环境目录&#xff08;这条是否必须&#xff0c;未确定&#xff09; 将目录root_of_vcpkg/installed/x64-windows/…...

C语言-链表_基础

链表-基础 1. 数组 1.1 静态数组 例子:int nums[5] {0};struct person ps[5]; 缺点:1,无法修改地址2,无法动态定义长度3,占用内存过大或过小4,增删速度慢 优点数组的内存是连续开辟的,所以读取速度快1.2 动态数组 例子:int *nums (int *) calloc(5,sizeof(int));struct p…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...