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

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

目录

延迟队列插件

延迟队列插件的下载

延迟队列插件的安装 

延迟队列插件的启用

​编辑 添加配置

常量类

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

编写生产消息代码

编写消费消息代码

观察效果

面试题


延迟队列插件

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-demo rabbitmq: addresses: amqp://study:[email protected]: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) 只适⽤特定版本

Read more

Flutter 组件 saropa_lints 适配鸿蒙 HarmonyOS 实战:代码质量守卫,构建性能合规性检查与自定义分析规约治理架构

Flutter 组件 saropa_lints 适配鸿蒙 HarmonyOS 实战:代码质量守卫,构建性能合规性检查与自定义分析规约治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 saropa_lints 适配鸿蒙 HarmonyOS 实战:代码质量守卫,构建性能合规性检查与自定义分析规约治理架构 前言 在鸿蒙(OpenHarmony)生态迈向大规模工业化协同、涉及超大型项目敏捷迭代、海量模块解耦及严苛 AOT 性能交付标准的背景下,如何实现一套能够自动拦截低质量代码、保障跨团队开发风格绝对统一且符合鸿蒙性能极致要求的“静态扫描中心”,已成为决定应用长期可维护性与研发效能感的关键。在鸿蒙设备这类强调 AOT 静态优化与严格类型安全的环境下,如果应用代码中充斥着滥用的 dynamic 调用或循环引用,由于由于编译期的类型擦除与运行时的屏障开销,极易由于由于“代码腐化”导致鸿蒙应用在长期运行后发生不可预知的内存泄露。 我们需要一种能够强制约束研发纪律、支持自定义规则扩展且具备“一站式”合规性判定的 Linter 方案。 saropa_lints 为 Flutter 开发者引入了“质量铁律”范式。它不是简单的代码检查

By Ne0inhk
微信小程序虚拟支付整合thinkphp核心实现 你的小程序如有开通会员等则为虚拟类型 要使用虚拟支付了 要不然判定为违规

微信小程序虚拟支付整合thinkphp核心实现 你的小程序如有开通会员等则为虚拟类型 要使用虚拟支付了 要不然判定为违规

小程序虚拟支付业务管理规范更新公告2026-02-27 各位开发者: 微信小程序现已全面支持iOS端虚拟支付服务,为虚拟支付业务相关的开发者提供更广阔的用户覆盖。目前iOS端虚拟支付享受15%优惠费率,极大降低开发者的运营成本。 为保障用户权益,提高交易安全,开发者在小程序内提供的虚拟商品、购买和支付现均需接入小程序虚拟支付。 若你的小程序内涉及虚拟支付业务,请在4月1日前全终端(包括iOS端、安卓端、Windows与鸿蒙端)接入虚拟支付,到期未接入将被判定为违规,根据违规程度将对该小程序采取风险提醒、限制功能直至暂停或终止提供服务等措施,请广大开发者及时对照以下接入指引、运营规范等文件业务,确保合规经营。 什么是虚拟支付业务:虚拟支付业务是指购买非实物商品,比如:VIP会员、充值代币、录制课程、录制音频视频等虚拟产品。 接入指引:小程序虚拟支付接入指引 运营规范:小程序虚拟支付行为运营规范 v 基于微信虚拟支付文档,你需要实现以下关键服务器API。所有接口请求方式均为POST,Content-Type: application/json,且需在URL中携带access_toke

By Ne0inhk
Unity游戏开发深度解析:从零基础到高级架构的完整实战指南

Unity游戏开发深度解析:从零基础到高级架构的完整实战指南

🌟 Hello,我是蒋星熠Jaxonic! 🌈 在浩瀚无垠的技术宇宙中,我是一名执着的星际旅人,用代码绘制探索的轨迹。 🚀 每一个算法都是我点燃的推进器,每一行代码都是我航行的星图。 🔭 每一次性能优化都是我的天文望远镜,每一次架构设计都是我的引力弹弓。 🎻 在数字世界的协奏曲中,我既是作曲家也是首席乐手。让我们携手,在二进制星河中谱写属于极客的壮丽诗篇! 摘要 Unity的魅力不仅在于其直观的可视化编辑器和强大的跨平台能力,更在于它为开发者提供了一个完整的生态系统。无论你是想要开发2D像素风格的独立游戏,还是要构建3D AAA级别的大型项目,Unity都能为你提供相应的解决方案。在我的开发历程中,我曾用Unity开发过移动端的休闲游戏、PC端的策略游戏,甚至还涉足了VR和AR应用的开发,每一次的项目经历都让我对Unity有了更深层次的理解。 特别值得一提的是Unity的组件化架构设计,这种设计理念不仅让游戏对象的管理变得更加灵活,也为代码的复用和维护提供了极大的便利。通过合理的组件设计和脚本编写,我们可以构建出高度模块化的游戏系统,这对于大型项目的团队协作尤为重要。

By Ne0inhk
Flutter 组件 smart_arg 适配鸿蒙 HarmonyOS 实战:智能命令行解析,构建高效开发者工具链与运维指令控制架构

Flutter 组件 smart_arg 适配鸿蒙 HarmonyOS 实战:智能命令行解析,构建高效开发者工具链与运维指令控制架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 smart_arg 适配鸿蒙 HarmonyOS 实战:智能命令行解析,构建高效开发者工具链与运维指令控制架构 前言 在鸿蒙(OpenHarmony)生态迈向工业自动化、边缘计算节点运维及开发者工具(Tooling)共建的背景下,如何为 Dart/Flutter 编写的工具脚本实现直观、健壮且具备强类型校验的命令行(CLI)参数解析,已成为提升开发与运维效率的“生产力基石”。在鸿蒙设备这类涉及大量无界面(Headless)守护进程调试与远程 SSH 控制的环境下,如果工具依然依赖基础的 List<String> 手动位置偏移解析,由于由于指令组合繁杂或参数类型误配,极易由于由于“指令注入”或默认值缺失导致关键运维任务的异常中断。 我们需要一种能够通过注解定义、支持强类型属性映射且具备自动化 Help 文档生成的智能化参数治理方案。 smart_

By Ne0inhk