RabbitMQ延迟队列(重要)

RabbitMQ延迟队列

  • 1、延迟队列
    • 1.1、延迟队列使用场景
    • 1.2、延迟队列实现原理
  • 2、使用rabbitmq-delayed-message-exchange 延迟插件
    • 2.1、下载
    • 2.2、安装
      • 2.2.1、解压
      • 2.2.2、启用插件
      • 2.2.3、查询安装情况
    • 2.4、示例
      • 2.4.1、RabbitConfig配置类(关键代码)
      • 2.4.2、发送消息(关键代码)
      • 2.4.3、application.yml配置类
      • 2.4.4、接收消息
      • 2.4.5、pom.xml
      • 2.4.6、测试

1、延迟队列

https://blog.csdn.net/weixin_42942786/article/details/139940269

1.1、延迟队列使用场景

场景:有一个订单,15分钟内如果不支付,就把该订单设置为交易关闭,那么就不能支付了,这类实现延迟任务的场景就可以采用延迟队列来实现,当然除了延迟队列来实现,也可以有一些其他办法实现;

1.2、延迟队列实现原理

RabbitMQ本身不支持延迟队列,可以使用TTL(过期消息)结合DLX(死信交换机)的方式来实现消息的延迟投递,即把DLX(死信交换机)跟某个队列绑定,到了指定时间,消息过期后,就会从DLX(死信交换机)路由到这个队列,消费者可以从这个队列取走消息。
在这里插入图片描述

2、使用rabbitmq-delayed-message-exchange 延迟插件

2.1、下载

选择对应的版本下载 rabbitmq-delayed-message-exchange 插件,
下载地址:http://www.rabbitmq.com/community-plugins.html

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

2.2、安装

插件拷贝到 RabbitMQ 服务器plugins目录下

2.2.1、解压

unzip rabbitmq_delayed_message_exchange-3.10.2.ez

如果unzip 没有安装,先安装一下

yum install unzip -y

2.2.2、启用插件

./rabbitmq-plugins enable rabbitmq_delayed_message_exchange 开启插件;

2.2.3、查询安装情况

./rabbitmq-plugins list 查询安装的所有插件;
重启rabbitmq使其生效;(此处也可以不重启)
在这里插入图片描述
消息发送后不会直接投递到队列,
而是存储到 Mnesia(嵌入式数据库),检查 x-delay 时间(消息头部);
延迟插件在 RabbitMQ 3.5.7 及以上的版本才支持,依赖 Erlang/OPT 18.0 及以上运行环境;

Mnesia 是一个小型数据库,不适合于大量延迟消息的实现
解决了消息过期时间不一致出现的问题。

2.4、示例

在这里插入图片描述

2.4.1、RabbitConfig配置类(关键代码)

package com.power.config;import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;
import java.util.Map;@Configuration
public class RabbitConfig {@Value("${my.exchangeName}")private String exchangeName;@Value("${my.queueDelayName}")private String queueDelayName;//创建自定义交换机@Beanpublic CustomExchange customExchange() {Map<String, Object> arguments = new HashMap<>();arguments.put("x-delayed-type","direct");return new CustomExchange(exchangeName,"x-delayed-message",true,false,arguments);}//创建队列@Beanpublic Queue queueNormal() {//建造者模式创建队列return QueueBuilder.durable(queueDelayName)//队列名称.build();}//队列绑定交换机@Beanpublic Binding binding(CustomExchange customExchange, Queue queueNormal) {return BindingBuilder.bind(queueNormal).to(customExchange).with("plugin").noargs();}}

2.4.2、发送消息(关键代码)

package com.power.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.Date;@Service
@Slf4j
public class MessageService {@Resourceprivate RabbitTemplate rabbitTemplate;@Beanpublic void sendMsg(){{MessageProperties messageProperties = new MessageProperties();messageProperties.setHeader("x-delay",25000);//第一条消息设置过期时间25秒Message message = MessageBuilder.withBody("hello world 01".getBytes()).andProperties(messageProperties).build();rabbitTemplate.convertAndSend("exchange.delay.04","plugin",message);log.info("消息order发送完毕,发送时间是:{}",new Date());}{MessageProperties messageProperties = new MessageProperties();messageProperties.setHeader("x-delay",15000);//第二条消息设置过期时间15秒Message message = MessageBuilder.withBody("hello world 02".getBytes()).andProperties(messageProperties).build();rabbitTemplate.convertAndSend("exchange.delay.04","plugin",message);log.info("消息pay发送完毕,发送时间是:{}",new Date());}}
}

2.4.3、application.yml配置类

server:port: 8080
spring:application:name: delay-plugins-test01rabbitmq:host: 你的服务器IPport: 5672username: 你的账号password: 你的密码virtual-host: powermy:exchangeName: exchange.delay.04         # 交换机queueDelayName: queue.delay.04          # 正常队列

2.4.4、接收消息

package com.power.message;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;import java.util.Date;@Component
@Slf4j
public class ReceiveMessage {@RabbitListener(queues = "queue.delay.04")public void receiveMsg(Message message){String body = new String(message.getBody());log.info("接收到的消息为:{},接收时间为:{}",body,new Date());}
}

2.4.5、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.power</groupId><artifactId>rabbit_07_delay04_plugins</artifactId><version>1.0-SNAPSHOT</version><name>rabbit_07_delay04_plugins</name><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.13</version><relativePath/></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2.4.6、测试

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习—神经网络如何高效实现

深度学习研究人员能够扩展神经网络的原因之一&#xff0c;在过去的十年里建立了非常大的神经网络&#xff0c;是因为神经网络可以向量化&#xff0c;它们可以使用矩阵乘法非常有效的实现&#xff0c;事实证明&#xff0c;并行计算硬件&#xff0c;包括gpus&#xff0c;但也有一…

【数据集】【YOLO】【目标检测】水面船只识别数据集 9798 张,YOLO船只识别算法实战训练教程!

一、数据集介绍 【数据集】水面船只识别数据集 9798 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。 数据集中包含1种分类&#xff1a;{0: ship}&#xff0c;代表水面船只。 数据集来自国内外图片网站和视频截图&#xff1b; 可用于无人机船只检测、监控灯塔船…

斜坡函数功能块(支持正常停机和紧急停机切换)

1、CODESYS斜坡函数功能块 CODESYS斜坡函数功能块(ST源代码)_用plc难能写一个斜坡加减速度吗-CSDN博客文章浏览阅读1k次。本文介绍了如何在CODESYS平台上创建斜坡函数功能块(FC),用于PID闭环控制中的给定值平滑处理。通过ST源代码实现,详细步骤包括仿真测试、变量修改、FC…

渗透测试--web基础之windows(二):常用命令详解及病毒编写

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人一律不承担一切后果 目录 一、常见端口对应的服务 二、 常见的cmd命…

【含文档】基于ssm+jsp的客户管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 管理员登录进入…

腾讯混元宣布大语言模型和3D模型正式开源

腾讯混元大模型正在加快开源步伐。 11月5日&#xff0c;腾讯混元宣布最新的MoE模型“混元Large“以及混元3D生成大模型“ Hunyuan3D-1.0”正式开源&#xff0c;支持企业及开发者精调、部署等不同场景的使用需求&#xff0c;可在HuggingFace、Github等技术社区直接下载&#xff…

《常用深度学习神经网络及其原理与应用场景》

一、总体介绍 一、引言 随着科技的不断发展&#xff0c;深度学习已经成为人工智能领域中最具影响力的技术之一。深度学习神经网络通过模拟人类大脑的神经元结构和工作方式&#xff0c;能够自动学习数据中的特征和模式&#xff0c;从而实现各种复杂的任务&#xff0c;如图像识…

操作系统三级调度相关习题

填空题 微机是以(总线)为组带构成的计算机系统在批处理兼分时系统中&#xff0c;往往把由分时系统控制的作业称为(前台)作业&#xff0c;把由批处理系统处理的作业称为(后台)作业在分时系统中&#xff0c;若时间片长度一定&#xff0c;则(用户数越多)&#xff0c;系统响应时间…

STL 迭代器iteratior 详解

C的标准模板库&#xff08;STL&#xff09;中&#xff0c;迭代器是一种重要的工具&#xff0c;用于访问容器中的元素。 迭代器是一个变量&#xff0c;相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素&#xff0c;通过迭代器就可以读写它指向的元素。从…

移门缓冲支架有什么作用?

移门缓冲支架是一种安装在滑动门上的装置&#xff0c;主要用于吸收门关闭时的冲击力&#xff0c;防止门突然停止时的震动&#xff0c;从而保护门体、轨道和墙体。移门缓冲支架不仅提升了门的使用体验&#xff0c;还增加了安全&#xff0c;延长了门的使用寿命。关于移门缓冲支架…

MATLAB大数计算工具箱及其用法

1. MATLAB大数工具箱Variable Precision Integer Arithmetic介绍 Variable Precision Integer Arithmetic是John DErrico 开发的大数运算工具箱&#xff0c;可以用完全任意大小的整数进行算术运算。支持vpi定义的数组和向量。 2.MATLAB代码 完整代码见: https://download.cs…

AI大模型如何重塑软件开发流程?

《AI大模型对软件开发流程的重塑&#xff1a;变革、优势、挑战与展望》 一、传统软件开发流程与模式&#xff08;一&#xff09;传统软件开发流程&#xff08;二&#xff09;传统软件开发模式面临的问题&#xff08;一&#xff09;AI在软件开发中的应用场景&#xff08;二&…

基于Python通过DOI下载文献(至简仅需2行代码)

文章目录 一、安装库二、导入库三、准备doi3.1 excel法3.1.1 检索数据3.1.2 导出excel 3.2 txt法3.3 列表or字符串法3.3.1 字符串3.3.2 列表 四、下载4.1 脚本4.2 下载成功4.3 已存在4.4 至于失败的 五、结果5.1 目标文件夹5.2 失败记录 一、安装库 pip install OAFuncs 二、导…

Git仓库

Git初始 概念 一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用 记录代码内容&#xff0c;&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 如何学&#xff1a; 个人本机使用&#xff1a;Git基础命令和概念 多…

excel常用技能

1.基础技能 1.1 下拉框设置 a. 选中需要设置的列或单元格&#xff0c;数据 ---》 数据验证 b.验证条件 ---> 序列&#xff08;多个值逗号隔开&#xff09; 2.函数 2.1 统计函数-count a.count(区域&#xff0c;区域&#xff0c;......) 统计数量&#xff0c;只针…

沙龙活动精彩回顾:攸信携手博格咨询,探索数智管理的奥秘

10月30日&#xff0c;一场聚焦数智管理的沙龙活动在热烈的氛围中圆满落幕。本次活动由攸信携手博格咨询共同举办&#xff0c;有幸邀请到了资深讲师书麟老师、攸信项目经理黄小容以及市场部经理高建成&#xff0c;他们共同为参会者带来了一场关于数智管理的知识盛宴。 01深入剖析…

17个工作必备的Python自动化代码

Python是一种流行的编程语言&#xff0c;以其简单性和可读性而闻名。因其能够提供大量的库和模块&#xff0c;它成为了自动化各种任务的绝佳选择。让我们进入自动化的世界&#xff0c;探索17个可以简化工作并节省时间精力的Python脚本。 1.自动化文件管理 1.1 对目录中的文件…

【IEEE/EI会议】第八届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2025)

会议通知 会议时间&#xff1a;2025年4月25-27日 会议地点&#xff1a;中国南京 会议官网&#xff1a;www.aemcse.org 会议简介 第八届先进电子材料、计算机与软件工程国际学术会议&#xff08;AEMCSE 2025&#xff09;由南京信息工程大学主办&#xff0c;将于2025年4月25日…

AndroidStudio-文本显示

一、设置文本的内容 1.方式&#xff1a; &#xff08;1&#xff09;在XML文件中通过属性&#xff1a;android:text设置文本 例如&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.andr…

关于CountDownLatch失效问题

一、项目背景 这几天要开发一个类似支付宝那种年度账单统计的功能&#xff0c;就是到元旦后支付完会把用户这一年的消费情况从各个维度&#xff08;我们把这一个维度称作一个指标&#xff09;统计分析形成一张报告展示给用户。 这个功能实现用到了CountDownLatch。假如统计分析…