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

RabbitMQ延迟消息(通过死信交换机实现)

延迟消息:生产者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间后才收到消息

通过DLX和TTL模拟出延迟队列的功能,即,消息发送以后,不让消费者拿到,而是等待过期时间,变成死信后,发送给死信交换机再路由到死信队列进行消费

1、声明延迟队列

package com.smart.wms.config.rabbitmq;import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 功能描述:* 配置交换机、队列、绑定关系* @Authoer: bgq* @Date:2024/6/4 17:33*/
@Configuration
public class MaterialStockExchangeConfig {public static final String MATERIAL_STOCK_EXCHANGE = "wms.material.exchange";public static final String MATERIAL_STOCK_QUEUE = "wms.material.queue";public static final String MATERIAL_DLX_DIRECT_EXCHANGE = "wms.dlx.exchange";public static final String MATERIAL_DLX_QUEUE = "wms.dlx.queue";public static final String MATERIAL_TTL__ROUTING_KEY = "ttl";public static final String MATERIAL_DLX_DELAYED_KEY = "dlx";@Beanpublic Queue ttlQueue() {return QueueBuilder.durable(MATERIAL_STOCK_QUEUE) // 指定队列的名称.ttl(10000) // 指定 TTL 为 10 秒,这里可设置过期时间也可以在发送消息时设置过期时间.deadLetterExchange(MATERIAL_DLX_DIRECT_EXCHANGE) // 指定死信交换机.deadLetterRoutingKey(MATERIAL_DLX_DELAYED_KEY) // 指定死信交换机的 RoutingKey.build();}/*** 声明TTl交换机*/@Beanpublic DirectExchange directExchange(){return new DirectExchange(MATERIAL_STOCK_EXCHANGE);}/*** 声明ttl交换机与队列的关联关系*/@Beanpublic Binding directBinding(){return BindingBuilder.bind(ttlQueue()).to(directExchange()).with(MATERIAL_TTL__ROUTING_KEY);}/*** 声明死信交换机*/@Beanpublic DirectExchange dlxDirect(){return new DirectExchange(MATERIAL_DLX_DIRECT_EXCHANGE);}/*** 声明死信队列*/@Beanpublic Queue dlxQueue(){return new Queue(MATERIAL_DLX_QUEUE);}/*** 声明死信交换机与队列关联关系*/@Beanpublic Binding tlxBinding(){return BindingBuilder.bind(dlxQueue()).to(dlxDirect()).with(MATERIAL_DLX_DELAYED_KEY);}}

2、监听死信队列消费

@RabbitListener(queues = MaterialStockExchangeConfig.MATERIAL_DLX_QUEUE)//监听的队列public void process(Message message, Channel channel) throws Exception {// 进入消息消费业务逻辑String body = new String(message.getBody());log.info("消息,参数:{}",body);JSONObject bodyJson = JSONUtil.parseObj(body);//业务逻辑TODOchannel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}

3、发送消息

@RequestMapping("/sendTTLMessage")
public void  sendTTLMessage(){JSONObject jsonObject = new JSONObject();jsonObject.putOpt("orderId",wmsSendOrder.getId());rabbitMQSendUtils.sendMessage(MaterialStockExchangeConfig.MATERIAL_STOCK_EXCHANGE,             MaterialStockExchangeConfig.MATERIAL_TTL__ROUTING_KEY, jsonObject, wmsSendOrder.getId().toString());log.info("消息发送成功!");
}

相关文章:

  • 电子画册制作与传统画册相比,有哪些优势?
  • nc网络收发测试-tcp客户端\TCP服务器\UDP\UDP广播
  • 仿element-ui 实现自己组件库 <3>
  • 前端 JS 经典:Vue 状态仓库持久化
  • 24年河北自考报名流程详细教程汇总
  • Python实战:小说分词统计-数据可视化
  • 前端框架之 MVVM
  • 金融与大模型:引领行业未来的创新融合
  • 6spark期末复习
  • 探索 Spring Boot 集成缓存功能的最佳实践
  • Ajax的应用
  • vue+elementUI实现在表格中添加输入框并校验的功能
  • 详解 Flink CDC 的介绍和入门案例
  • 微服务与分布式面试题
  • 高效文件传输攻略:利用局域网共享实现极速数据同步
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • CentOS 7 修改主机名
  • express如何解决request entity too large问题
  • FastReport在线报表设计器工作原理
  • go append函数以及写入
  • Java比较器对数组,集合排序
  • js如何打印object对象
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • oldjun 检测网站的经验
  • Python3爬取英雄联盟英雄皮肤大图
  • Python中eval与exec的使用及区别
  • rc-form之最单纯情况
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • vue 个人积累(使用工具,组件)
  • Vue ES6 Jade Scss Webpack Gulp
  • 程序员该如何有效的找工作?
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 关于Java中分层中遇到的一些问题
  • 提醒我喝水chrome插件开发指南
  • 小程序01:wepy框架整合iview webapp UI
  • 一天一个设计模式之JS实现——适配器模式
  • MPAndroidChart 教程:Y轴 YAxis
  • 如何在招聘中考核.NET架构师
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​插件化DPI在商用WIFI中的价值
  • !!Dom4j 学习笔记
  • # 职场生活之道:善于团结
  • (PySpark)RDD实验实战——求商品销量排行
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)计算机毕业设计大学生兼职系统
  • (算法)Travel Information Center
  • (转)Sublime Text3配置Lua运行环境
  • (转)Windows2003安全设置/维护
  • (转)一些感悟
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】