SpringBoot整合RabbitMQ实现延迟队列功能

请添加图片描述

👨🏻‍💻 热爱摄影的程序员
👨🏻‍🎨 喜欢编码的设计师
🧕🏻 擅长设计的剪辑师
🧑🏻‍🏫 一位高冷无情的编码爱好者
大家好,我是 DevOps 工程师
欢迎分享 / 收藏 / 赞 / 在看!

延迟队列是一种常见的消息队列模式,用于在一定时间后处理消息。在本文中,我们将探讨如何使用 Spring Boot 和 RabbitMQ 实现延迟队列功能。

通常情况下,生产者将消息发送给普通交换机,由普通交换机发送给普通的队列给消费者进行消费,当消息被拒绝、消息 TTL 过期或者队列达到最大长度时,消息成为死信消息,将被丢弃给死信交换机处理,由死信交换机发送给死信队列进行下一步处理。

但是,实现死信队列上述步骤可以简化为:生产者直接将消息发送给死信交换机并设置过期时间,如果消息 TTL 达到,则被丢弃到死信队列,而此时监听着死信队列的消费者就可以及时地消费到消息。由此可以通过死信队列的机制实现延迟队列的功能。
请添加图片描述

首先,使用 Docker 构建好 RabbitMQ 容器服务。注意,笔者使用的是自行构建的带有延迟插件的镜像 hongyoudan/rabbitmq-management-delayed:3.12,大家可以使用笔者构建好的镜像直接创建容器,如果使用其他镜像需关注是否安装了延迟插件 rabbitmq_delayed_message_exchange,如果未安装,需自行安装,因为要实现 RabbitMQ 延迟队列的功能,需要开启该插件。

docker run -d \
--name rabbitmq \
-p 5672:5672 -p 15672:15672 \
hongyoudan/rabbitmq-management-delayed:3.12

初始化项目,使用 Spring 初始化器新建项目。

引入 Web 和 AMQP 两个依赖项:

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

编写配置文件:

server:port: 3031spring:rabbitmq:addresses: 127.0.0.1port: 5623username: guestpassword: guest

编写 RabbitMQ 配置类:

/*** @Author: hayden* @Date: 2023-09-28* @Description: RabbitMQ配置类*/
@Configuration
public class RabbitMQConfig {/*** 定义延迟队列*/@Beanpublic Queue delayedQueue() {// 参数:name 队列名称,durable 是否持久化,exclusive 是否排他,autoDelete 是否自动删除return new Queue(DELAY_QUEUE_NAME, true, false, false);}/*** 定义延迟交换机*/@Beanpublic CustomExchange delayedExchange() {Map<String, Object> args = new HashMap<>();args.put("x-delayed-type", "direct");// 参数:name 交换机名称,type 交换机类型,durable 是否持久化,autoDelete 是否自动删除,arguments 参数return new CustomExchange(DELAY_EXCHANGE_NAME, "x-delayed-message", true, false, args);}/*** 将延迟队列绑定到延迟交换机*/@Beanpublic Binding delayBinding(Queue delayedQueue, CustomExchange delayedExchange) {// 参数:队列,交换机,路由键return BindingBuilder.bind(delayedQueue).to(delayedExchange).with(DELAY_ROUTING_KEY).noargs();}
}

通用常量类:

/*** @Author: hayden* @Date: 2023-09-28* @Description: 常量类*/
public class Constant {public static final String DELAY_QUEUE_NAME = "delay_queue";public static final String DELAY_EXCHANGE_NAME = "delay_exchange";public static final String DELAY_ROUTING_KEY = "delay_routing_key";
}

生产者:

/*** @Author: hayden* @Date: 2023-09-28* @Description: 生产者*/
@Component
public class Producer {@Autowiredprivate RabbitTemplate rabbitTemplate;public String sendDelayMessage(String message, int delayTime) {// 参数:交换机名称,路由键,消息内容,消息处理器(设置消息的延迟时间)rabbitTemplate.convertAndSend(DELAY_EXCHANGE_NAME, DELAY_ROUTING_KEY, message, new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {message.getMessageProperties().setDelay(delayTime);return message;}});String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());System.out.println("发送消息:" + message + ",延迟时间:" + delayTime + "ms" + ",当前时间:" + time);return "发送消息:" + message + ",延迟时间:" + delayTime + "ms" + ",当前时间:" + time;}
}

消费者:

/*** @Author: hayden* @Date: 2023-09-28* @Description: 消费者*/
@Component
public class Consumer {@RabbitListener(queues = DELAY_QUEUE_NAME)public void processDelayMessage(String message) {String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());System.out.println("消费消息: " + message + ",当前时间:" + time);}
}

控制器:

/*** @Author: hayden* @Date: 2023-09-28* @Description: 控制器*/
@RestController
public class SendMessageController {@Autowiredprivate Producer producer;@GetMapping("/sendMessage")public String sendMessage(@RequestParam("message") String message, @RequestParam("delayTime") int delayTime) {return producer.sendDelayMessage(message, delayTime);}
}

完整项目结构:

在这里插入图片描述

使用接口测试工具 Apifox 进行测试。测试发送消息为:aaa,延迟时间为 5 秒。在控制台中可以看到在发送消息 5 秒后,消息才被消费。

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

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

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

相关文章

【vue3】toRef与toRefs的使用,toRef与ref的区别

假期第四篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 1、toRef与toRefs 创建一个ref对象&#xff0c;其value值指向另一个对象中的某个属性 语法&#xff1a;const name toRef&#xff08;person,‘name’&#xf…

期权定价模型系列【7】:Barone-Adesi-Whaley定价模型

期权定价模型系列第7篇文章 1.前言 目前大连商品交易所、郑州商品交易所、以及上海期货交易所的所有商品期权都为美式期权&#xff0c;并且大商所的所有期权合约会根据BAW(Barone-Adesi-Whaley)美式期权定价模型计算新上市期权合约的挂牌基准价。 BAW模型(Barone-Adesi and W…

动态规划算法(1)--矩阵连乘和凸多边形剖分

目录 一、动态数组 1、创建动态数组 2、添加元素 3、删除修改元素 4、访问元素 5、返回数组长度 6、for each遍历数组 二、输入多个数字 1、正则表达式 2、has.next()方法 三、矩阵连乘 1、什么是矩阵连乘&#xff1f; 2、动态规划思路 3、手推m和s矩阵 4、完…

Vue之transition组件

Vue提供了transition组件&#xff0c;使用户可以更便捷地添加过渡动画效果。 transition组件 transition组件也是一个抽象组件&#xff0c;并不会渲染出真实dom。Vue会在其第一个真实子元素上添加过渡效果。 props render 这里将render分为两部分&#xff0c;第一部分界定真…

skywalking源码本地编译运行经验总结

前言 最近工作原因在弄skywalking&#xff0c;为了进一步熟悉拉了代码下来准备debug&#xff0c;但是编译启动项目我就费了老大劲了&#xff0c;所以准备写这篇&#xff0c;帮兄弟们少踩点坑。 正确步骤 既然是用开源的东西&#xff0c;那么最好就是按照人家的方式使用&…

云服务器租用价格表概览_阿里云腾讯云华为云

云服务器租用价格多少钱一年&#xff1f;阿腾云分享阿里云、腾讯云和华为云的云服务器租用价格表&#xff1a;阿里云2核2G服务器108元一年起、腾讯云2核2G3M带宽轻量服务器95元一年、华为云2核2G3M云耀L实例89元一年起&#xff0c;阿腾云分享更多关于云服务器租用价格明细&…

PICO首届XR开发者挑战赛正式启动,助推行业迈入“VR+MR”新阶段

9月25日&#xff0c;“PICO 2023首届XR开发者挑战赛”&#xff08;下文简称“挑战赛”&#xff09;媒体启动会在北京圆满落幕&#xff0c;官方赛事报名通道已于今日开启。据悉&#xff0c;本次挑战赛是PICO首次针对全球开发者举办的大型挑战赛事&#xff0c;旨在与开发者保持连…

第1篇 目标检测概述 —(4)目标检测评价指标

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测评价指标是用来衡量目标检测算法性能的指标&#xff0c;可以分为两类&#xff0c;包括框级别评价指标和像素级别评价指标。本节课就给大家重点介绍下目标检测中的相关评价指标及其含义&#xff0c;希望大家学习之后…

15np+pandas+matplotlib

numpy 维数 一维:shape(4,)二维:shape(4,5)三维:shape(4,5,6) 创建ndarray–np.array() # 可以是数组[1,2,3] 元组(1,2,3) 迭代对象range(n) np.array([1,2,3,4,5])列表中元素类型不同&#xff0c;会使用元素类型最大的作为ndarray类型 指定维度ndim 赋值操作 赋值&#xff…

NLP 01(介绍)

一、NLP 自然语言处理 (Natural Language rrocessing,简称NLP) 是计算机科学与语言学中关注于计算机与人类语言间转换的领域。 1.1 发展 规则&#xff1a;基于语法 自然语言处理的应用场景: 语音助手 机器翻译 搜索引擎 智能问答

独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”

各位CSDN的uu们你们好呀&#xff0c;今天依旧是小雅兰的51单片机的内容&#xff0c;内容主要是&#xff1a;独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位&#xff0c;下面&#xff0c;让我们进入51单片机的世界吧&#xff01;&a…

基于Qt Creator开发的坦克大战小游戏

目录 介绍开发环境技术介绍安装说明项目目录设计思想项目介绍运行演示知识点记录Gitee源码链接 介绍 &#xff01;&#xff01;&#xff01;资源图片是从网上免费下载&#xff0c;源码都是原创&#xff0c;供个人学习使用&#xff0c;非盈利&#xff01;&#xff01;&#xff…

Elastic SQL 输入:数据库指标可观测性的通用解决方案

作者&#xff1a;Lalit Satapathy, Ishleen Kaur, Muthukumar Paramasivam Elastic SQL 输入&#xff08;metricbeat 模块和输入包&#xff09;允许用户以灵活的方式对许多支持的数据库执行 SQL 查询&#xff0c;并将结果指标提取到 Elasticsearch。 本博客深入探讨了通用 SQL …

Java进阶02 Array、内存分析、this、面向对象、继承、override、super、实例化、多态、向下转型、Object

文章目录 一、数组(Array)二、数组的内存分析三、Array工具类四、面向对象的一些小知识五、进阶知识补充1. this关键字2.继承3.方法重写4.super关键字的使用5.子类对象实例化6.多态性的体现7.向下转型8.Object类 一、数组(Array) 数组&#xff1a;多个相同类型数据按照一定顺序…

Qt应用开发(基础篇)——视图基类 QAbstractItemView

一、前言 QAbstractItemView类继承于QWidget&#xff0c;为全部视图类提供了基本的功能。 QAbstractItemView类是一个抽象类&#xff0c;不能被实例化使用&#xff0c;它是QtWidget框架中树视图QTreeView、列表视图QListView、表格视图QTableView、单列视图QColumnView和标题头…

nginx 反向代理 负载均衡 动静分离

一样东西的诞生通常都是为了解决某些问题&#xff0c;对于 Nginx 而言&#xff0c;也是如此。 比如&#xff0c;你出于无聊写了一个小网站&#xff0c;部署到 tomcat 之后可以正常访问 但是后来&#xff0c;你的这个小网站因为内容很诱人逐步的火了&#xff0c;用户越来越多&a…

深度学习笔记_1、定义神经网络

1、使用了PyTorch的nn.Module类来定义神经网络模型;使用nn.Linear来创建全连接层。(CPU) import torch.nn as nn import torch.nn.functional as F from torchsummary import summary# 定义神经网络模型 class Net(nn.Module):def __init__(self):super(Net, self).__init__()…

赋能工业数字化转型|辽宁七彩赛通受邀出席辽宁省工业互联网+安全可控先进制造业数字服务产业峰会

2023年9月25日下午&#xff0c;由软通动力信息技术&#xff08;集团&#xff09;股份有限公司主办的“工业互联网安全可控先进制造业数字服务产业峰会”在辽宁沈阳顺利举办。省市区各级政府、科研院所领导、技术专家、企业高管以及生态合作伙伴代表等齐聚一堂&#xff0c;共同探…

【JVM】第五篇 垃圾收集器G1和ZGC详解

导航 一. G1垃圾收集算法详解1. 大对象Humongous说明2. G1收集器执行一次GC运行的过程步骤3. G1垃圾收集分类4. G1垃圾收集器参数设置5. G1垃圾收集器的优化建议6. 适合使用G1垃圾收集器的场景?二. ZGC垃圾收集器详解1. NUMA与UMA2. 颜色指针3. ZGC的运作过程4. ZGC垃圾收集器…

【ShaderLab罪恶装备卡通角色_二次元风格_“Sol Badguy“_角色渲染(第二篇)】

罪恶装备背德之炎卡通角色_二次元风格_Unity 角色渲染 角色初始效果&#xff1a;基础渲染SimpleBas 资源分析模型顶点颜色&#xff1a; 贴图资源SOL_base_基础色块效果&#xff1a;其中SOL_base_A通道的效果&#xff1a; SOL_ilm&#xff1a;如下SOL_ilm模型上区域分布- 左到右…