RabbitMQ安装及Springboot 集成RabbitMQ实现消息过期发送到死信队列

死信队列

RabbitMQ 的死信队列(Dead-Letter-Exchanges,简称 DLX)是一个强大的特性,它允许在消息在队列中无法被正常消费(例如,消息被拒绝并且没有设置重新入队,或者消息过期)时,将这些消息转发到另一个交换机。这个特性在很多场景下都非常有用,比如重试机制、延迟队列等。

以下是关于 RabbitMQ 死信队列的一些要点:

如何设置死信队列

要设置死信队列,你需要在队列声明时指定几个参数:

x-dead-letter-exchange:指定消息在变为死信后要发送到的交换机。
x-dead-letter-routing-key(可选):指定消息在变为死信后使用的路由键。如果未设置,则使用原消息的路由键。
message-ttl 或 x-message-ttl(可选):设置消息的生存时间(TTL)。当消息在队列中的时间超过此值后,它将成为死信。
x-max-length(可选):设置队列的最大长度。当队列中的消息数量超过此值时,最早的消息将成为死信。
这些参数可以通过 RabbitMQ 的管理界面、命令行工具或编程 API 设置。

死信队列的工作流程

当一个消息在队列中由于某些原因(如过期、被拒绝且未设置重新入队、队列达到最大长度等)成为死信时。
RabbitMQ 会检查该队列是否配置了 x-dead-letter-exchange。
如果配置了,RabbitMQ 会将死信发送到指定的死信交换机。
死信交换机再根据配置的路由键或原消息的路由键将消息路由到相应的队列。

windows安装RabbitMQ

RabbitMQ是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang。

安装Erlang

因为RabbitMQ服务器是用Erlang语言编写的, 所以,你需要去查看rabbitMq适应Erlang的版本,因为不同的rabbitMq版本对应不同的Erlang版本,可以点击如下该链接查看版本匹配度:
https://www.rabbitmq.com/which-erlang.html#compatibility-matrix

下载地址:Erlang
推荐使用链接: https://download.csdn.net/download/weixin_42123075/89064540,这里包含Erlang和对应版本的RabbitMQ。
下载完成后先安装Erlang。

RabbitMQ安装

下载地址: https://github.com/rabbitmq/rabbitmq-server/releases?page=7

设置环境变量

  1. windows + R 在左下角的弹出框中输入control system
  2. 点击高级系统设置,点击环境变量
  3. 系统变量,新建变量名:RABBITQM_SERVER
    变量值:rabbitmq安装地址bin目录之前的地址,比如我的是D:\Software\rabbitmq\rabbitmq_server-3.8.15
  4. 找到系统变量中的PATH,点击编辑,点击新建,输入%RABBITQM_SERVER%\sbin,点击确定。

安装 rabbitmq_management

  1. 打开Windows Poweshell或者cmd,输入如下指令
rabbitmq-plugins list

如下图所示
在这里插入图片描述

  1. 安装rabbitmq_management插件
    这款插件是可以可视化的方式查看RabbitMQ服务器实例的状态,以及操控RabbitMQ服务器。
rabbitmq-plugins enable rabbitmq_management

如下图所示
在这里插入图片描述

  1. 启动rabbitMq服务

安装rabbitMq的目录(我的是D:\Software\rabbitmq\rabbitmq_server-3.8.15) -> sbin目录 -> 双击rabbitmq-server.bat,我如下图所示:
在这里插入图片描述

  1. 如果启动报错在这里插入图片描述
    原因是:原先的RabbitMq数据与新的RabbitMq有些不兼容
    解决方案:
    sudo rm -rf /var/lib/rabbitmq/mnesia
    win解决方案,在 RabbitMQ 安装目录中找到 mnesia 目录(通常在 C:\Users\AppData\Roaming\RabbitMQ\db),然后删除其中的文件
    参考: https://www.cnblogs.com/gaoyuechen/p/10368188.html,重新启动。
    启动成功,但程序不是以deamon形式运行。只要执行-detached可执行成功。
rabbitmq-server -detached
  1. 访问http://localhost:15672/管理页面,用户名,密码默认均为guest。

创建死信队列和交换机

创建dead-letter-queue死信队列

在这里插入图片描述

创建dead-letter-exchange死信交换机,并绑定死信队列

在这里插入图片描述
在这里插入图片描述

创建普通队列和普通交换机并指定死信交换机

创建普通队列myQueue和普通交换机myExchange,交换机类型为Topic,并指定死信队列
在这里插入图片描述

SpringBoot集成RabbitMQ

添加maven依赖

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

在yml配置文件中的spring下添加RabbitMQ的连接信息

spring:rabbitmq:addresses: localhost:5672connection-timeout: 15000password: guestusername: guest# 使用启用消息确认模式
#    publisher-confirms: truevirtual-host: /

RabbitMQConfig


import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {// 普通队列public final static String QUEUE_NAME = "myQueue";// 普通交换机public final static String EXCHANGE_NAME = "myExchange";// 普通队列路由public final static String ROUTING_KEY = "myRoutingKey";// 死信交换机public static final String DEAD_LETTER_EXCHANGE = "dead-letter-exchange";// 死信队列public static final String DEAD_LETTER_QUEUE = "dead-letter-queue";// 死信路由public static final String DEAD_LETTER_ROUTING_KEY = "dead-letter-key";@BeanTopicExchange myExchange() {return new TopicExchange(EXCHANGE_NAME);}@BeanBinding binding(Queue myQueue, TopicExchange myExchange) {return BindingBuilder.bind(myQueue).to(myExchange).with(ROUTING_KEY);}/*** 定义死信交换机* @return DirectExchange*/@Beanpublic DirectExchange deadLetterExchange() {return new DirectExchange(DEAD_LETTER_EXCHANGE);}/*** 定义死信队列* @return Queue*/@Beanpublic Queue deadLetterQueue() {return new Queue(DEAD_LETTER_QUEUE,true,false,false,null);}/*** 死信队列绑定死信交换机* @param deadLetterQueue 死信队列* @param deadLetterExchange 死信交换机* @return Binding*/@Beanpublic Binding deadLetterBinding(Queue deadLetterQueue, DirectExchange deadLetterExchange) {return BindingBuilder.bind(deadLetterQueue).to(deadLetterExchange).with(DEAD_LETTER_ROUTING_KEY);}/*** 普通队列声明指定死信交换机* @return*/@Beanpublic Queue myQueue() {return QueueBuilder.durable(QUEUE_NAME)// 设置死信交换机.withArgument("x-dead-letter-exchange", DEAD_LETTER_EXCHANGE)// 设置死信路由键.withArgument("x-dead-letter-routing-key", DEAD_LETTER_ROUTING_KEY)// 设置队列最大长度// .withArgument("x-max-length", 5).build();}}

发送消息类RabbitMQService

import com.ruoyi.quartz.config.RabbitMQConfig;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class RabbitMQService {@Autowiredprivate AmqpTemplate rabbitTemplate;public void send(String message) {rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, RabbitMQConfig.ROUTING_KEY, message);}/*** 发送消息并设置过期时间* @param exchange 交换机* @param routingKey 路由* @param messageBody 消息体* @param expirationTimeInMillis 过期时间,单位:毫秒*/public void sendMessageWithExpiration(String exchange, String routingKey, String messageBody, int expirationTimeInMillis) {MessageProperties properties = new MessageProperties();// 设置消息的过期时间properties.setExpiration(String.valueOf(expirationTimeInMillis));Message message = MessageBuilder.withBody(messageBody.getBytes()).andProperties(properties).build();rabbitTemplate.convertAndSend(exchange, routingKey, message);}
}

监听队列接收消息ReceiverService


import com.ruoyi.quartz.config.RabbitMQConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;import java.text.SimpleDateFormat;
import java.util.Date;@Service
public class ReceiverService {/*** 监听队列消息 如果要测试死信队列,就不要监听此队列* @param message 消息*/
//    @RabbitListener(queues = RabbitMQConfig.QUEUE_NAME)public void receive(String message) {System.out.println("Received <" + message + ">");}/*** 监听死信队列* @param message*/@RabbitListener(queues = RabbitMQConfig.DEAD_LETTER_QUEUE)public void processDeadLetter(String message) {String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());System.out.println("Received dead letter message: " + message + ",当前时间:" + time);// 处理死信队列中的消息}
}

测试死信队列

    @GetMapping("/sendMessageTtl/{message}")public void sendMessageTtl(@PathVariable String message){log.info("当前时间发送:{},发送5条消息给两个TTL队列:{}",new Date().toString(),message);for (int i = 0; i < 6; i++) {System.out.println("测试延迟队列======="+DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,new Date()));rabbitMQService.sendMessageWithExpiration(RabbitMQConfig.EXCHANGE_NAME,RabbitMQConfig.ROUTING_KEY,"测试5秒延迟==============》",5000);}}

5秒后私信队列收到消息

在这里插入图片描述

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

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

相关文章

NineAi3.5 –支持GPT绘图,语音播报,联网访问,上下文关联,语音模式

NineAi3.5 –支持GPT绘图&#xff0c;语音播报&#xff0c;联网访问&#xff0c;上下文关联&#xff0c;语音模式 基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c; 还能根据聊天的上下文进行互动&…

python_绘图_多条折线图绘制_显示与隐藏

1. 需求 给定一个二维数组 100行, 5列, 每一列绘制一条折线, 横轴为行索引, 纵轴为对应位置的值, 绘制在一个子图里面, 使用python plot, 使用随机颜色进行区别添加显示和隐藏按钮, 可以对每条折线进行显示和隐藏 2. 代码 import numpy as np import matplotlib.pyplot as p…

parallel linux虚拟机没有root权限

前言 今天刚在parallel上装上linux虚拟机&#xff0c;安装的是Debian发行版。用终端输入命令时&#xff0c;无意间发现当前用户竟然不是root用户&#xff0c;岂有此理&#xff01;众所周知&#xff0c;Linux系统一般安装之后都是默认root用户的&#xff0c;但是可能parallel先…

SSM框架学习——SqlSession以及Spring与MyBatis整合

SqlSession以及Spring与MyBatis整合 准备所需要的JAR包 要实现MyBatis与Spring的整合&#xff0c;很明显需要这两个框架的JAR包&#xff0c;但是只是使用这两个框架中所提供的JAR包是不够的&#xff0c;还需要配合其他包使用&#xff1a; Spring的JAR包MyBatis的JAR包Spring…

用ChatGPT出题,完全做不完

最近小朋友正在学习加减法&#xff0c;正好利用ChatGPT来生成加减法练习题&#xff0c;小朋友表示够了&#xff0c;够了&#xff0c;完全做不完。本文将给大家介绍如何利用ChatGPT来生成练习题。 尚未获得ChatGPT的用户&#xff0c;请移步&#xff1a;五分钟开通GPT4.0。 角色…

用Python实现办公自动化(自动化处理PDF文件)

自动化处理 PDF 文件 目录 自动化处理 PDF 文件 谷歌浏览器 Chrome与浏览器驱动ChromeDriver安装 &#xff08;一&#xff09;批量下载 PDF 文件 1.使用Selenium模块爬取多页内容 2.使用Selenium模块下载PDF文件 3.使用urllib模块来进行网页的下载和保存 4.使用urllib…

ARMv8-A架构下的外部debug模型(external debug)简介

Armv8-A external debug Armv8-A debug模型一&#xff0c;外部调试 External debug 简介二&#xff0c;Debug state2.1 Debug state的进入与退出 三&#xff0c;DAP&#xff0c;Debug Access Port3.1 EDSCR, External Debug Status and Control Register调试状态标识&#xff0…

搭建Flutter开发环境、从零基础到精通(文末送书【北大出版社】)

目录 搭建开发环境 1. 下载Flutter SDK 2. 设置镜像地址及环境变量 3. 安装与设置Android Studio 4. 安装Visual Studio Code与Flutter开发插件 5. IDE的使用和配置 6. 安装Xcode 7. 检查Flutter开发环境 好书推荐 内容简介 作者简介 搭建开发环境 Flutter可以跨平…

【数据结构】非线性结构---二叉树

1、树 1.1 树的相关概念 节点的度&#xff1a;一个节点含有的子树的个数称为该节点的度&#xff1b; 如上图&#xff1a;A的为6 叶节点或终端节点&#xff1a;度为0的节点称为叶节点&#xff1b; 如上图&#xff1a;B、C、H、I...等节点为叶节点 非终端节点或分支节点&#…

[flink 实时流基础] 输出算子(Sink)

学习笔记 Flink作为数据处理框架&#xff0c;最终还是要把计算处理的结果写入外部存储&#xff0c;为外部应用提供支持。 文章目录 **连接到外部系统****输出到文件**输出到 Kafka输出到 mysql自定义 sink 连接到外部系统 Flink的DataStream API专门提供了向外部写入数据的方…

128:忆往昔,迎春来

机缘 时间真的是过得好快啊&#xff0c;128&#xff0c;距离我的第一篇博客已经128天了&#xff0c;从大一上的冬天&#xff0c;到大一下的春夏&#xff0c;从一个初入大学的新人&#xff0c;到一个开始思考未来的新人。我开始不断更新博客&#xff0c;开始不断吸收知识&#…

【21-40】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

【21-40】计算机网络基础知识&#xff08;非常详细&#xff09;从零基础入门到精通&#xff0c;看完这一篇就够了 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用21、HTTPS是如何保证数据传输的安全&#xff0c;整体的流程是什么&#xff1f;&#xff08;SSL是…

【Servlet】Servlet入门

文章目录 一、介绍二、入门案例导入servlet-api的解决办法 一、介绍 概念&#xff1a;server applet&#xff0c;即&#xff1a;运行在服务器端的小程序 Servlet就是一个接口&#xff0c;定义了Java类被浏览器访问到&#xff08;tomcat识别&#xff09;的规则。 将来我们定义…

Spring Boot | Spring Boot的“数据访问“、Spring Boot“整合MyBatis“

目录: 一、Spring Boot”数据访问概述“二、Spring Boot”整合MyBatis”1. 基础环境搭建 (引入对应的“依赖启动器” 配置数据库的“相关参数”)① 数据准备 (导入Sql文件)② 创建项目&#xff0c;引入相应的启动器&#xff0c;编写数据库对应的“实体类”③额外添加pom.xml文…

海康Ehome2.0与5.0设备接入EasyCVR视频汇聚平台时的配置区别

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

【Ubuntu】用 VMware 安装 macOS

本教程使用 Ubuntu 20.04.6 LTS&#xff0c;VMware Workstation Pro 17.5.1&#xff0c;macOS Sonoma 14.4。文中所有需要的下载链接均以 Markdown 的形式体现在文字上。 下载 VMware Workstation Pro&#xff0c;目前最新版本是 17.5.1。 使用密钥&#xff0c;进行破解。 VM…

SpringBoot+uniApp宠物领养小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.保存宠物信息代码2.提交订单信息代码3.查询评论信息代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootuniApp框架开发的宠物领养微信小程序系统。…

R语言,数据类型转换

原文链接&#xff1a;R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天&#xff0c;再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢&#xff1f; 我们在使用R语言做数据分析时&#xff0c;会一直对数据进行不同类型的转换&#xff0c;有时候…

【Java】API——Calendar日期类使用+题目演示

目录 Calendar日期类简单介绍 导入对应包&#xff1a; 获取 Calendar 对象&#xff1a; 设置日期和时间&#xff1a; 获取日期和时间的各个部分&#xff1a; 日期和时间的加减操作&#xff1a; 例题&#xff1a;世纪末的星期 题目描述 题目代码 Calendar日期类简单介绍…

typescript 实现RabbitMQ死信队列和延迟队列 订单10分钟未付归还库存

Manjaro安装RabbitMQ 安装 sudo pacman -S rabbitmq rabbitmqadmin启动管理模块 sudo rabbitmq-plugins enable rabbitmq_managementsudo rabbitmq-server管理界面 http://127.0.0.1:15672/ 默认用户名和密码都是guest。 要使用 rabbitmqctl 命令添加用户并分配权限&#xf…