实用指南:详解RabbitMQ高级特性之延迟插件的安装和使用

news/2025/9/23 17:46:27/文章来源:https://www.cnblogs.com/tlnshuju/p/19107631

实用指南:详解RabbitMQ高级特性之延迟插件的安装和使用

2025-09-23 17:44  tlnshuju  阅读(0)  评论(0)    收藏  举报

目录

延迟队列插件

延迟队列插件的下载

延迟队列插件的安装 

延迟队列插件的启用

​编辑 添加配置

常量类

声明队列和交换机并绑定二者关系

编写生产消息代码

编写消费消息代码

观察效果

面试题


延迟队列插件

RabbitMQ官⽅也提供了⼀个延迟的插件来实现延迟的功能。

延迟队列插件的下载

插件下载链接---》链接

根据⾃⼰的RabbitMQ版本选择相应版本的延迟插件, 下载后上传到服务器。

查看RabbitMQ版本的命令

rabbitmqctl status | grep "RabbitMQ"

/usr/lib/rabbitmq/plugins 是⼀个附加⽬录, RabbitMQ包本⾝不会在此安装任何内容, 如果
没有这个路径, 可以⾃⼰进⾏创建。

延迟队列插件的安装 

把下载好的 .ez文件上传到   /usr/lib/rabbitmq/plugins  这个路径下。

查看rabbitmq插件的命令

rabbitmq-plugins list

延迟队列插件的启用

启用延迟队列插件的命令

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

 添加配置
spring:application:name: rabbit-extensions-demorabbitmq:addresses: amqp://study:study@47.98.109.138:5672/extension
常量类
public class Constants {
//延迟队列
public static final String DELAY_QUEUE = "delay.queue";
public static final String DELAY_EXCHANGE = "delay.exchange";
}
声明队列和交换机并绑定二者关系
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import rabbitextensionsdemo.constant.Constants;
@Configuration
public class DelayConfig {
@Bean("delayQueue")
public Queue delayQueue(){
return QueueBuilder.durable(Constants.DELAY_QUEUE).build();
}
@Bean("delayExchange")
public Exchange delayExchange(){
return ExchangeBuilder.directExchange(Constants.DELAY_EXCHANGE).delayed().build();
}
@Bean("delayBinding")
public Binding delayBinding(@Qualifier("delayQueue") Queue queue, @Qualifier("delayExchange") Exchange exchange){
return BindingBuilder.bind(queue).to(exchange).with("delay").noargs();
}
}
编写生产消息代码
@RequestMapping("/delay2")
public String delay2() {
System.out.println("delay2...");
rabbitTemplate.convertAndSend(Constants.DELAY_EXCHANGE, "delay", "delay test 30s...", message -> {
message.getMessageProperties().setDelayLong(30000L);  //单位: 毫秒, 过期时间为30s
return message;
});
rabbitTemplate.convertAndSend(Constants.DELAY_EXCHANGE, "delay", "delay test 10s...", message -> {
message.getMessageProperties().setDelayLong(10000L);  //单位: 毫秒, 延迟时间为10s
return message;
});
System.out.printf("%tc 消息发送成功 \n", new Date());
return "消息发送成功";
}
编写消费消息代码
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import rabbitextensionsdemo.constant.Constants;
import java.util.Date;
@Component
public class DelayListener {
@RabbitListener(queues = Constants.DELAY_QUEUE)
public void delayHandMessage(Message message, Channel channel) throws Exception {
//消费者逻辑
System.out.printf("[delay.queue] %tc 接收到消息: %s \n", new Date(), new String(message.getBody(),"UTF-8"));
}
}
观察效果

此时我们可以看到,哪怕把TTL为30秒的消息先于TTL为10秒的消息进行发送,也不会影响根据延迟时间进行消息的发送。

面试题

1.介绍下RabbitMQ的延迟队列

延迟队列是⼀个特殊的队列, 消息发送之后, 并不⽴即给消费者, ⽽是等待特定的时间, 才发送给消费者.

延迟队列的应⽤场景有很多, ⽐如:

1. 订单在⼗分钟内未⽀付⾃动取消
2. ⽤⼾注册成功后, 3天后发调查问卷
3. ⽤⼾发起退款, 24⼩时后商家未处理, 则默认同意, ⾃动退款

但RabbitMQ本⾝并没直接实现延迟队列, 通常有两种⽅法:

1. TTL+死信队列组合的⽅式
2. 使⽤官⽅提供的延迟插件实现延迟功能

2.上面两种实现方法二者对比

1. 基于死信实现的延迟队列
a. 优点: 1) 灵活不需要额外的插件⽀持
b. 缺点: 1) 存在消息顺序问题 2) 需要额外的逻辑来处理死信队列的消息, 增加了系统的复杂性
2. 基于插件实现的延迟队列
a. 优点: 1) 通过插件可以直接创建延迟队列, 简化延迟消息的实现. 2) 避免了DLX的时序问题
b. 缺点: 1) 需要依赖特定的插件, 有运维⼯作 2) 只适⽤特定版本

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

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

相关文章

Django 视图层

目录视图函数HttpRequest对象常用属性:常用方法:HttpResponse对象 参考文档:https://zhuanlan.zhihu.com/p/151368045 视图函数 视图函数,简称视图,属于Django的视图层,默认定义在views.py文件中,是用来处理web请…

科技 公司 响应式 网站知名广州网站建设

前言 阅读本文需要阅读一些前置知识 [信号与系统]傅里叶变换、卷积定理、和为什么时域的卷积等于频域相乘。 [信号与系统]有关滤波器的一些知识背景 [信号与系统]关于LTI系统的转换方程、拉普拉斯变换和z变换 [信号与系统]关于双线性变换 IIR滤波器的数学表达式 IIR&…

第二部分:VTK核心类详解(第38章 vtkPointData点数据类) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Kettle: pentaho-server-9.4登录问题

测试环境:Pentaho-server-ce-9.4.0.0 + mysql8.0.35+ openJDK11测试环境:Pentaho-server-ce-9.4.0.0 + mysql8.0.35+ openJDK11 点击登陆时(admin / password) .界面提示: 发生登录错误。请重试。 部分日志信息如…

企业内部信息网站如何建设广告设计培训学校

设置pdo属性 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

网站开发市场分析丹东网站建设

效果 1、适合搜素表单布局,查询重置等功能块始终位于最后一行的最后一列 2、适合普通多行两端对齐,未填充满的行左对齐 思路 此脚本目的为实现整齐风格的表单布局,为了达到整齐的效果,每个表单元素或者块都要设置一致的 宽度…

网站商城的建设今天中美关系最新消息

高校教务系统密码加密逻辑及JS逆向 本文将介绍皖西学院教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文,你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习,勿用于非法用途。 一、密…

网站推广问题学做西餐网站

在Vue.js框架中,数据监听是一个核心功能,它允许开发者创建响应式的应用程序。这一功能的实现主要依赖于Vue的响应式系统,其中最关键的部分是如何监控数据变化并响应这些变化。以下是一个对Vue中数据监听实现方式的简要概述,适用于…

城市建设投资公司 网站开发者选项怎么打开

学习目标: 解释Linux网络配置的重要性和作用引入常见的面试问题 学习内容: 如何查看当前系统的IP地址和网关信息? 解答:可以使用ifconfig命令来查看当前系统的IP地址和网关信息。通过运行ifconfig命令,将会列出所有可…

Win11/Win10/Office 永久激活

1、使用快捷键Windows键+R键打开运行框,输入powershell,点确定运行,弹出powershell命名行输入窗口,输入以下命令进行激活: irm https://get.activated.win | iex同时也可以输入备用命令进行激活: irm win.zyqq.to…

提供微网站制作网络公司推广公司网站有哪些方式

很相似的两个概念,一不小心就会混淆 首先,对两个名词做一个大概的解释: 下标越界 在引用数组元素时,使用的下标超过了该数组下标的应有范围,但应注意的是: C/C不对数组做边界检查。 可以重写数组的每一…

springboot~获取原注解的方法findMergedAnnotation使用场景

这是一个很好的问题,涉及到Spring注解的元注解处理和属性别名机制。让我详细解释一下Spring JMS是如何获取到你自定义注解中的destination值的。 核心机制:Spring的注解属性别名(Attribute Aliasing) 当你在自定义注…

自己有个服务器 怎样做网站深圳东莞网站开发

一.问题描述 假如我们有一个数组,数组中的元素有正数和负数,如何在数组中找到一段连续的子数组,使得子数组各个元素之和最大。 二.问题分析 分治法求解: 初始状态: low0;highA.length-1;mid&am…

贵阳网站建设哪家公司好山东做网站公司

目录 一. 🦁 前言二. 🦁 像小说一样趣读 Linux 源码三. 🦁 学习路线 一. 🦁 前言 最近、道然科技给狮子送了两本书:一本是付东来的《labuladong的算法笔记》、一本是闪客著的《Linux源码趣读》,《labulado…

手机网页及网站设计网站设计大概多少钱

添加法国,它位于右下方,因此我们应该看到一点…plot(FR,addTRUE)然后,我们可以检索英国退欧公投数据referendumddply(referendum,.(Region,HASC_code),summarise,Remainsum(Remain),Leavesum(Leave))我们可以发现,脱欧赢得了51.89…

德宏网站制作企业推广方式优选隐迅推

一、前言 本次部署elk所有的服务都部署在k8s集群中,服务包含filebeat、logstash、elasticsearch、kibana,其中elasticsearch使用集群的方式部署,所有服务都是用7.17.10版本 二、部署 部署elasticsearch集群 部署elasticsearch集群需要先优化…

南通做网站建设公司网站建设方案计划书人员规划

文章目录一、拖拽滚动1、封装函数2、示例:二、滚轮缩放1、封装函数2、结合拖拽滚动示例一、拖拽滚动 1、封装函数 /*** description 使用鼠标拖拽div,实现横向、纵向滚动* param el 被拖拽滚动的元素(产生滚动条的元素)*/functio…

比较好的wordpress主题seo外链优化方法

Qt Design Studio设计出的项目结构有多个层级的目录,我们直接用类似Qt Creator工具的方式加载main.qml文件时会报错提示module "content" is not installed,将content加入importPath后还是报同样的错误。 Qt Design Studio生成的文件包含了.qm…

南宁seo网站建设费用环保网站建设公司哪家好

股票商场是一种杂乱的国际,不同类型的股票对应不同的生意商场。其间,创业板股票是一个备受关注的论题。那么,什么样的股票归于创业板呢?本文将从商场定义、股票分类以及出资关键点三个角度分析这个问题,帮忙读者全面了…

长沙建个网站要多少钱彩票网站建设dadi163

用场景的丰富,企业面临着前所未有的数据存储挑战。大规模数据存储变得日常化,伴随着超大容量和快速变化的I/O需求,传统的存储解决方案已经难以满足企业对弹性、运维效率及总体拥有成本(TCO)的更高要求。这些挑战促使基…