RabbitMq 延迟队列

devtools/2024/12/22 23:48:24/

前言

延迟消息队列在我们工作中使用的场景特别多,比如超时未支付取消订单,异步业务时间有时间间隔,等等,今天我们就来聊一聊使用消息延迟队列

需求

使用RabbitMq  实现延迟队列,5分钟之后进行消息的消费

方式

  1. 基于死信队列
  2. 基于插件 (如果支持可以用,如果没有建议第一种,怕引入插件产生版本冲突)

实现

 今天就基于死信队列咱们玩一下
原理图

delay impl

代码实现
 import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author wind* @example ${bizName} 自己的业务名称,记得替换   eg: pay_cancel*  使用时同一替换 ${bizName}* @des :*    1. 准备两个普通队列*    2. 其中的一个队列构造 是 自己的queuename + ttl + deadExchange + deadRoutingKey  (core )*/
@Configuration
public class ${bizName}DelayConfig {public  static final String ${bizName}_DELAY_EXCHANGE_NAME =${bizName}+"_delay_exchange";public  static final String ${bizName}_DELAY_QUEUE_NAME =${bizName}+"r_delay_queue";public  static final String ${bizName}_DELAY_ROUTING_KEY =${bizName}+"_delay_routing_key";public  static final String ${bizName}_DEAD_EXCHANGE_NAME =${bizName}+"_dead_exchange";public  static final String ${bizName}_DEAD_QUEUE_NAME =${bizName}+"dead_queue";public  static final String ${bizName}_DEAD_ROUTING_KEY =${bizName}+"_dead_routing_key";/*** 核心  和死信队列建立关键的核心*/@BeanQueue delayedQueue() {return QueueBuilder.durable(${bizName}_DELAY_QUEUE_NAME).ttl(300000).deadLetterExchange(${bizName}_DEAD_EXCHANGE_NAME).deadLetterRoutingKey(${bizName}_DEAD_ROUTING_KEY).build();}@Beanpublic DirectExchange delayedExchange(){return  new DirectExchange(${bizName}_DELAY_EXCHANGE_NAME);}@BeanBinding delayedBinding(Queue delayedQueue,DirectExchange delayedExchange) {return BindingBuilder.bind(delayedQueue).to(delayedExchange).with(${bizName}_DELAY_ROUTING_KEY);}@Beanpublic Queue deadQueueOrder() {return QueueBuilder.durable(${bizName}_DEAD_QUEUE_NAME).deadLetterExchange(${bizName}_DEAD_EXCHANGE_NAME).deadLetterRoutingKey(${bizName}_DEAD_ROUTING_KEY).build();}@Beanpublic DirectExchange deadExchangeOrder() {return new DirectExchange(${bizName}_DEAD_EXCHANGE_NAME);}@Beanpublic Binding bindingDeadExchange(Queue deadQueueOrder,DirectExchange deadExchangeOrder) {return BindingBuilder.bind(deadQueueOrder).to(deadExchangeOrder).with(${bizName}_DEAD_ROUTING_KEY);}}监听:
/*** @author wind* @des  监听的是死信队列  ttl 过后进行消费**/
@Component
@Slf4j
@RequiredArgsConstructor
public class ${bizName}DelayRefundMqListener {@RabbitListener(queues=${bizName}DelayConfigDelayConfig.${bizName}_DEAD_QUEUE_NAME)public void rechargeResult(String msg, Channel channel, Message message) {try {log.info("业务消息进来 rechargeResultMQMessage:{}", msg);处理业务逻辑} finally {try {channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {log.error("充值退款延迟消息 确认消息失败");}}}}

http://www.ppmy.cn/devtools/55206.html

相关文章

贪心算法——最少跳跃步数(C++)

未来,未来。 ——2024年6月17日 题目描述 给定一个含n(1≤n≤1000)个非负整数数组nums(0≤nums[i]≤1000),数组中的每个元素表示在该位置可以跳跃的最大长度,假设总是可以从初始位置0到达最后一…

数据库的概念-数据库、数据库管理系统、数据库系统、数据库管理员、数据库设计人员、开发管理使用数据库系统的人员

一、数据库(DB) 1、数据库就是存储数据的仓库,只不过这个仓库是在计算机存储设备上 2、严格的说,数据库是长期存储在计算机内、有组织的、统一管理的、可共享的相关数据的集合 3、数据库应是为一个特定目标而设计、构建并装入数…

物联网系统运维——数据库部署

一.MySQL 1.概要 MySQL是一种关联数据库管理系统,关联数据:而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性库将数据保存在不同的表中。性能高、成本低、可靠性好,已经成为最流行的开源数据库。 二.MySQL安装与配置 1. …

人工智能和机器学习的应用日益广泛,在医疗健康领域的具体应用是什么?

人工智能(AI)和机器学习(ML)在医疗健康领域的应用日益广泛,涵盖了从疾病预测、辅助诊断、药物研发到健康管理等多个方面。以下是一些具体的应用实例和成功案例: 疾病预测与辅助诊断:机器学习算…

网络安全,怎么搭建Python防范环境

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python网络安全项目开发实战_搭建Python防范环境_编程案例解析实例详解课程教程.pdf 构建一个Python环境下的网络安全防范体系是一个涉及多个层面和步…

PostgreSQL源码分析——审计插件pgaudit

PostgreSQL审计插件pgaudit 在PostgreSQL中,提供了开源的审计插件pgaudit,但是其功能并不完善,只提供了基本的审计功能,对此,很多基于PG开发的商业数据库大多提供了丰富的审计功能。比如人大金仓,openGaus…

2.华为配置静态路由

通过配置静态路由让PC1和PC2互通 AR1 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [Huawei]int g0/0/1 [Huawei-GigabitEthernet0/0/1]ip add 1.1.1.1 24 [Huawei]ip route-static 192.168.2.0 24 1.1.1.2AR2 [Huawei]int g0/0/0 [Huawei-Gig…

ESP-IDF OTA机制详解(9)

接前一篇文章:ESP-IDF OTA机制详解(8) 上一回开始对于乐鑫官网例程中OTA代码主要流程中的核心部分——esp_https_ota_perform函数进行解析,讲解了函数的前两段内容。本回继续往下进行解析。为了便于理解和回顾,再次贴出…