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

RabbitMQ+springboot用延迟插件实现延迟消息的发送

延迟队列:其实就是死信队列中消息过期的特殊情况

延迟队列应用场景:

在这里插入图片描述
可以用死信队列来实现,不过死信队列要等上一个消息消费成功,才会进行下一个消息的消费,这时候就需要用到延迟插件了,不过要线在docker上装一个插件

安装过程(Linux【Docker】)

前置条件是在Docker中部署过RabbitMq。

1、打开你的远程工具,首先查看docker中已有的容器,主要是为了查看rabbitmq的容器ID

2、将本地下载好的压缩包传到服务器某文件夹下,然后将其复制到Docker中的RabbitMq容器中的plugins文件夹下。

docker cp /home/rabbitmq_delayed_message_exchange-3.8.0.ez a687ef46141b:/plugins

3、进入容器查看该目录下是否有该压缩包。

进入容器命令:(通过容器号或者容器名)

docker exec -it a687ef46141b bash

4、同样在容器中的命令行执行一下命令添加插件。

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

5、退出容器,重启该容器。

6、在管理端即同样可以看到新增了一种交换机模式。

总结:以上就是RabbitMQ的延迟插件的安装过程!

基于插件的延迟队列DEMO

成功安装RabbitMQ的延迟插件之后,我们就可以尝试写一个延迟队列来验证一下是否可以解决上述问题。

首先我们的测试环境是在一个Springboot的框架下完成!

1、最先写配置类

/*** 定义延迟交换机*/
@Configuration
public class RabbitMQDelayedConfig {//队列private static final String DELAYQUEUE = "delayedqueue";//交换机private static final String DELAYEXCHANGE = "delayedExchange";@Beanpublic Queue delayqueue(){return new Queue(DELAYQUEUE);}//自定义延迟交换机@Beanpublic CustomExchange delayedExchange(){Map<String, Object> arguments = new HashMap<>();arguments.put("x-delayed-type","direct");/*** 1、交换机名称* 2、交换机类型* 3、是否需要持久化* 4、是否需要自动删除* 5、其他参数*/return new CustomExchange(DELAYEXCHANGE,"x-delayed-message",true,false,arguments);}//绑定队列和延迟交换机@Beanpublic Binding delaybinding(){return BindingBuilder.bind(delayqueue()).to(delayedExchange()).with("sectest").noargs();}
}

2、先写生产者

/*** 基于插件的延迟队列* 消息生产者*/
@Service
@Slf4j
public class DelayMQSender {@Autowiredprivate RabbitTemplate rabbitTemplate;public void sendmsg(String message,Integer delaytime){log.info("当前时间:{},发送时长{}信息给延迟队列:{}",new Date().toString(),delaytime,message);rabbitTemplate.convertAndSend("delayedExchange","sectest",message,msg->{//设置发送消息的延长时间 单位:msmsg.getMessageProperties().setDelay(delaytime);return msg;});}
}

3、再写消费者

/*** 基于插件的延迟队列* 消息的消费者*/
@Service
@Slf4j
public class DelayMQReceiver {@RabbitListener(queues = "delayedqueue")public void receivemsg(Message messages){String msg = new String(messages.getBody());log.info("当前时间:{},接收时长信息给延迟队列:{}",new Date().toString(),msg);}
}

4、进行测试

将模拟请求放在了一个简易的网页上,点击后输出如下结果,证明当先发送了20s延时的消息,再发送2s延时的消息,在2s后消息正常被消费,基于插件的延迟队列完美解决了问题。

**【思考】:**如果在实际业务场景中使用延迟队列的话,那就需要服务端在消息被消费之后主动告诉前端消费的结果,如果是这样的话,那么Ajxs的通信方式是单双工通信,只能前端主动访问后端并返回结果,后端无法主动发送消息,应该使用Websocket来进行通信才可,websocket是长连接,不同于http的短连接,可以实现全双工通信,前后端都可以主动发送消息。

相关文章:

RabbitMQ+springboot用延迟插件实现延迟消息的发送

延迟队列&#xff1a;其实就是死信队列中消息过期的特殊情况 延迟队列应用场景&#xff1a; 可以用死信队列来实现&#xff0c;不过死信队列要等上一个消息消费成功&#xff0c;才会进行下一个消息的消费&#xff0c;这时候就需要用到延迟插件了&#xff0c;不过要线在docker上…...

多线程和并发(1)—等待/通知模型

一、进程通信和进程同步 1.进程通信的方法 同一台计算机的进程通信称为IPC&#xff08;Inter-process communication&#xff09;&#xff0c;不同计 算机之间的进程通信被称为 RPC(Romote process communication)&#xff0c;需要通过网络&#xff0c;并遵守共同的协议。**进…...

浏览器的事件循环

其实在我们电脑的操作系统中&#xff0c;每一个运行的程序都会由自己的进程&#xff08;可能是一个&#xff0c;也可能有多个&#xff09;&#xff0c;浏览器就是一个程序&#xff0c;它的运行在操作系统中&#xff0c;拥有一组自己的进程&#xff08;主进程&#xff0c;渲染进…...

跳跃游戏 II【贪心算法】

跳跃游戏 II class Solution {public int jump(int[] nums) {int cur 0;//当前最大覆盖路径int next 0;//下一步的最大覆盖路径int res 0;//存放结果&#xff0c;到达终点时最少的跳跃步数for (int i 0; i < nums.length; i) {//遍历数组&#xff0c;以给出数组以一个…...

promise

promise 属于事件循环的微任务&#xff0c;具体详见&#xff1a;事件循环 Promise 语法: const p1 new Promise((reslove,reject)>{console.log(2);reslove(1) }).then((data)>{console.log(3);console.log(data) }).catch((data)>{console.log(3); }) promise.th…...

前端面试:【网络协议与性能优化】HTTP/HTTPS、TCP/IP和WebSocket

嗨&#xff0c;亲爱的Web开发者&#xff01;在构建现代Web应用时&#xff0c;了解网络协议是优化性能和确保安全性的关键。本文将深入探讨HTTP/HTTPS、TCP/IP和WebSocket这三个网络协议&#xff0c;帮助你理解它们的作用以及如何优化Web应用的性能。 1. HTTP/HTTPS协议&#xf…...

设计模式之工厂模式(万字长文)

文章目录 概述工厂模式的优点包括工厂模式有几种主要的变体看一个具体需求使用传统的方式来完成传统的方式的优缺点 简单工厂模式基本介绍使用简单工厂模式简单工厂模式的优缺点优点&#xff1a;缺点&#xff1a; 工厂方法模式看一个新的需求思路 1思路 2工厂方法模式介绍工厂方…...

CNN 02(CNN原理)

一、卷积神经网络(CNN)原理 1.1 卷积神经网络的组成 定义 卷积神经网络由一个或多个卷积层、池化层以及全连接层等组成。与其他深度学习结构相比&#xff0c;卷积神经网络在图像等方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他浅层或深度神经…...

Android View动画整理

View 动画相关内容可参考官网 动画资源 此前也有写 View 动画相关的内容&#xff0c;但都只是记录代码&#xff0c;没有特别分析。以此篇作为汇总、整理、分析。 Android View 动画有4中&#xff0c;分别是 平移动画 TranslateAnimation缩放动画 ScaleAnimation旋转动画 Rot…...

阿里云架构

负载均衡slb 分类以及应用场景 负载均衡slb clb 传统的负载均衡(原slb) 支持4层和7层(仅支持对uri(location),域名进行转发) 一般使用slb(clb) alb 应用负载均衡 只支持7层,整合了nginx负载均衡的各种功能,可以根据用户请求头,响应头 如果需要详细处理用户请求(浏…...

【C语言】操作符大全(保姆级介绍)

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将详细介绍各种操作符的功能。 目录&#xff1a; &#x1f4d8; 前言① 算术操作符②移位操作符③位操作符④赋值操…...

ruoyi-cloud部署

默认你已经安装mysql&#xff0c;nacos&#xff0c;seata&#xff0c;sentinel等&#xff08;没有的可以先找教程安装&#xff09; 1、下载源码&#xff1a;git clone https://gitee.com/zhangmrit/ruoyi-cloud 2、项目依赖导入&#xff0c;选择自己的maven环境等&#xff0c;创…...

Vue3(开发h5适配)

在开发移动端的时候需要适配各种机型&#xff0c;有大的&#xff0c;有小的&#xff0c;我们需要一套代码&#xff0c;在不同的分辨率适应各种机型。 因此我们需要设置meta标签 <meta name"viewport" content"widthdevice-width, initial-scale1.0">…...

图的存储:邻接矩阵法

1.邻接矩阵的实现 邻接矩阵的定义&#xff1a;在无向图和有向图中&#xff0c;使用二维数组表示各个顶点的相邻情况&#xff1a;1代表相邻&#xff0c;0表示不相邻。 代码实现&#xff1a; #define MaxVertexNum 100//顶点数目的最大值 typedef struct {char Vex [MaxVertexN…...

如何优雅的使用Git?

第一部分&#xff1a;Git的基本概念和初始设置 Git是一个分布式版本控制系统&#xff0c;它允许多人共同工作&#xff0c;同时跟踪和管理项目的版本历史。使用Git&#xff0c;您可以恢复旧版本、创建新分支进行实验&#xff0c;并与其他开发者进行协作&#xff0c;而不会影响主…...

【【STM32分析IO该设置什么模式的问题】】

STM32分析IO该设置什么模式的问题 我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉&#xff0c;但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以…...

飞天使-k8s基础组件分析-服务与ingress

文章目录 服务的介绍服务代理服务发现连接集群外服务服务发布无头服务 服务&#xff0c;pod和dns的关系端口转发通过expose 暴露应用服务案例INGRESSMetalLB使用参考文档 服务的介绍 服务的作用是啥&#xff1f; 提供外部调用&#xff0c;保证podip的真实性看看服务解决了什么…...

Unity——拖尾特效

拖尾是一种很酷的特效。拖尾的原理来自人类的视觉残留&#xff1a;观察快速移动的明亮物体&#xff0c;会看到物体移动的轨迹。摄像机通过调整快门时间&#xff0c;也可以拍出具有拖尾效果的照片&#xff0c;如在城市的夜景中&#xff0c;汽车的尾灯拖曳出红色的线条。 在较老…...

java开发之fastjson

依赖 <!-- fastjson依赖 --> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> <…...

第一个C语言程序:HelloWorld

第一个C语言程序 注释 注释 对代码的解释和说明 特点 ○ 不会被执行 目的 让人们能够更加轻松地看懂代码 分类 行注释 // 快键键 ctrl/ 块注释 /**/ 快捷键 shiftalta 示例代码&#xff1a; #include <stdio.h>int main() {// 行注释/*块注释*/printf("hello w…...

RT thread—iic—at24c04读写操作

at24c04介绍&#xff1a;存储容量&#xff1a;4 Kbits&#xff08;即 512 字节&#xff09;。内部结构为 32 页&#xff0c;每页 16 字节。地址0x000-0x1FF通信接口&#xff1a;标准 I2C&#xff08;时钟线 SCL 和数据线 SDA&#xff09;&#xff0c;支持最高 400 kHz 的快速模…...

数字IC时序约束实战:深入解析clock_uncertainty的设置策略与后端影响

1. 时钟不确定度的本质与组成 刚入行数字IC设计时&#xff0c;我最头疼的就是时序约束里那些看似相似却又微妙差别的概念。记得第一次看到clock_uncertainty这个参数&#xff0c;我盯着综合报告里的红色违例发了半小时呆。后来才明白&#xff0c;这个参数就像给时钟信号加了&qu…...

1220亿美元!OpenAI创下史上最大融资纪录;DeepSeek连续三天发生服务异常;Claude Code 51万行源码泄露 | 极客头条

「极客头条」—— 技术人员的新闻圈&#xff01;CSDN 的读者朋友们好&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。&#xff08;投稿或寻求报道&#xff1a;zhanghycsdn.net&#xff09;整理 | 苏宓出品 | CSDN&#xff08;ID&…...

GLM-4.1V-9B-Base应用场景:零售货架图像识别与SKU自动盘点方案

GLM-4.1V-9B-Base应用场景&#xff1a;零售货架图像识别与SKU自动盘点方案 1. 零售行业面临的库存管理挑战 走进任何一家超市或便利店&#xff0c;你都会看到整齐排列的商品货架。但你可能不知道的是&#xff0c;这些看似简单的货架背后隐藏着一个巨大的管理难题 - 库存盘点。…...

Geoserver空间查询全解析:从基础bbox到高级CQL_FILTER的完整指南

Geoserver空间查询全解析&#xff1a;从基础bbox到高级CQL_FILTER的完整指南 当你面对海量地理空间数据时&#xff0c;如何快速准确地提取所需信息&#xff1f;Geoserver作为开源地理信息系统&#xff08;GIS&#xff09;的中枢神经&#xff0c;其强大的空间查询能力往往被开发…...

Qwen3.5-9B-AWQ-4bit企业应用落地:电商商品图智能解析与文字提取实战

Qwen3.5-9B-AWQ-4bit企业应用落地&#xff1a;电商商品图智能解析与文字提取实战 1. 电商场景下的图片理解挑战 在电商运营中&#xff0c;每天需要处理海量商品图片。传统的人工审核和标注方式面临三大痛点&#xff1a; 效率瓶颈&#xff1a;人工处理一张商品图平均需要3-5分…...

Qwen3.5-2B轻量化优势展示:相同GPU下并发数提升300%实测数据

Qwen3.5-2B轻量化优势展示&#xff1a;相同GPU下并发数提升300%实测数据 1. 轻量化模型的核心价值 1.1 为什么需要轻量化模型 在AI应用落地过程中&#xff0c;模型部署成本一直是关键瓶颈。传统大模型虽然效果出色&#xff0c;但对硬件要求高、推理耗时长、并发能力有限&…...

3步搭建高效NTQQ机器人:LuckyLilliaBot全功能配置指南

3步搭建高效NTQQ机器人&#xff1a;LuckyLilliaBot全功能配置指南 【免费下载链接】LuckyLilliaBot NTQQ的OneBot API插件 项目地址: https://gitcode.com/gh_mirrors/li/LuckyLilliaBot LuckyLilliaBot是一款基于OneBot11协议的NTQQ机器人框架&#xff0c;它能帮助开发…...

基于S7-300与组态王的智能药片装瓶机控制系统优化设计

1. 智能药片装瓶机控制系统的核心价值 在制药生产线上&#xff0c;药片装瓶环节看似简单却暗藏玄机。传统的人工装瓶方式不仅效率低下&#xff0c;还容易出现计数错误、交叉污染等问题。我曾在某药企亲眼见过工人因疲劳导致装瓶数量出错&#xff0c;最终整批药品不得不报废的案…...

ModTheSpire模组加载器全攻略:解锁杀戮尖塔无限可能

ModTheSpire模组加载器全攻略&#xff1a;解锁杀戮尖塔无限可能 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 副标题&#xff1a;从零开始的模组探索之旅——让你的游戏体验突破边界…...