如何在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)和死信交换机:


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漏洞复现--Apache Ofbiz XML-RPC RCE(CVE-2023-49070)

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

短视频账号矩阵系统源码搭建步骤包括以下几个方面:

短视频账号矩阵系统源码搭建步骤包括以下几个方面&#xff1a; 1. 确定账号类型和目标受众&#xff1a;确定要运营的短视频账号类型&#xff0c;如搞笑、美食、美妆等&#xff0c;并明确目标受众和定位。 2. 准备账号资料&#xff1a;准备相关资质和资料&#xff0c;如营业执照…

数据清洗、特征工程和数据可视化、数据挖掘与建模的主要内容

1.4 数据清洗、特征工程和数据可视化、数据挖掘与建模的内容 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.4节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学…

Jquery easyui异步提交表单的两种方式

这篇文章分享一下easyui常用的两种表单异步提交的方式。 目录 第一种&#xff1a;利用ajax提交 $.post() $.ajax() 第二种&#xff1a;使用easyui提供的表单提交方式 首先&#xff0c;准备一个简单的表单&#xff0c;包含三个输入框&#xff0c;在页面引入easyui的js文件。…

机器学习---朴素贝叶斯算法

朴素贝叶斯&#xff08;Naive Bayes ,NB&#xff09;算法是基于贝叶斯定理与特征条件独立假设的分类方法&#xff0c;该算法是有监督的学习算法&#xff0c;解决的是分类问题&#xff0c;是将一个未知样本分到几个预先已知类别的过程。 朴素贝叶斯的思想就是根据某些个先验概率…

LainChain 原理解析:结合 RAG 技术提升大型语言模型能力

摘要&#xff1a;本文将详细介绍 LainChain 的工作原理&#xff0c;以及如何通过结合 RAG&#xff08;Retrieval-Aggregated Generation&#xff09;技术来增强大型语言模型&#xff08;如 GPT 和 ChatGPT 等&#xff09;的性能。我们将探讨 COT、TOT、RAG 以及 LangChain 的概…

【Ajax】发送get请求获取接口数据

编写html实现通过Ajax发送get请求并获取数据 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

商务与经济统计案例分析:3-1Pelican 商店——python 实现

商务与经济统计案例分析:3-1Pelican 商店 要求Python实现 要求 1.净销售额的描述统计量和各种不同类型顾客的净销售额的描述统计量。 2.关于年龄与净销售额之间关系的描述统计量。 Python实现 0.相关分析&#xff1a;2-1案例 1.净销售额的描述统计量和各种不同类型顾客的净销…

EasyRecovery2024免费永久版手机数据恢复软件

EasyRecovery2024是一款操作安全、用户可自主操作的数据恢复方案&#xff0c;它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。能恢…

长城之上的无人机:文化遗产的守护者

长城之上的无人机&#xff1a;文化遗产的守护者 在八达岭长城景区&#xff0c;两架无人机分别部署在了长城的南、北楼两点。根据当前的保护焦点和需求&#xff0c;制定了5条无人机综合巡查航线&#xff0c;以确保长城景区的所有开放区域都能得到有效监管。每天&#xff0c;无人…

Dockerfile详解#如何编写自己的Dockerfile

文章目录 前言编写规则指令详解FROM&#xff1a;基础镜像LABEL&#xff1a;镜像描述信息MAINTAINER&#xff1a;添加作者信息COPY&#xff1a;从宿主机复制文件到镜像中ADD&#xff1a;从宿主机复制文件到镜像中WORKDIR&#xff1a;设置工作目录 前言 Dockerfile是编写docker镜…

017 OpenCV 向量机SVM

目录 一、环境 二、SVM原理 三、完整代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、SVM原理 OpenCV中的向量机&#xff08;SVM&#xff09;是一种监督学习算法&#xff0c;用于分类和回归分析。它通过找到一个最优的超平…