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

RabbitMq实现延迟队列功能

1、rabbitmq服务端打开延迟插件 (超过 4294967295毫秒 ≈ 1193 小时 ≈ 49.7 天  这个时间会立即触发)

注意:只有RabbitMQ 3.6.x以上才支持

在下载好之后,解压得到.ez结尾的插件包,将其复制到RabbitMQ安装目录下的plugins文件夹。

然后通过命令行启用该插件:

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

该插件在通过上述命令启用后就可以直接使用,不需要重启。

2、添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

3、配置交换机和队列

@Configuration
public class DelayedConfig {public static String EXCHANGE_NAME = "delayed_exchange";public static String QUEUE_NAME = "delayed_queue";public static String KEY_NAME = "delayed_key";/*** 基于插件实现的交换机,必须是CustomExchange类型,标识这是一个延时类型的交换机*/@Bean()public CustomExchange delayedExchange(){Map<String,Object> params = new HashMap<>();params.put("x-delayed-type","direct");//参数1:交换机名字,参数2:交换机的类型,参数3:是否持久化,参数4:是否自动删除队列,参数5:交换机的额外参数设置return new CustomExchange(EXCHANGE_NAME,"x-delayed-message",true,false,params);}@Bean()public Queue delayedQueue(){return new Queue(QUEUE_NAME);}@Beanpublic Binding delayedBinding(){return BindingBuilder.bind(delayedQueue()).to(delayedExchange()).with(KEY_NAME).noargs();}}

 4、发送和接收消息

@GetMapping("/t5")public void t5(){Date date = new Date();System.out.println("发送时间:" + date.toString());//发送消息rabbitTemplate.convertAndSend(DelayedConfig.EXCHANGE_NAME,DelayedConfig.KEY_NAME,"1延迟消息wxm",msg->{msg.getMessageProperties().setHeader(MessageProperties.X_DELAY, 15552000000L);msg.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);return msg;});//发送消息rabbitTemplate.convertAndSend(DelayedConfig.EXCHANGE_NAME,DelayedConfig.KEY_NAME,"延迟消息wxm",msg->{msg.getMessageProperties().setDelay(10000);msg.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);return msg;});log.info("发送成功");}@RabbitHandler@RabbitListener(queues = "delayed_queue")public void getDelayed(Message message, Channel channel) throws Exception{Date date = new Date();String rightNow = date.toString();String msg = new String(message.getBody());// 手动应答System.out.println(message.getMessageProperties().getDeliveryTag());channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);System.out.println("接受成功:"+msg+rightNow);}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【CSS】使用 CSS 自定义属性(变量)-- var()
  • 基于python的汽车数据分析与可视化---附源码99290
  • 微信小程序详细登录流程
  • Jenkins 2.346.1完整搭建及项目部署安装
  • C语言家教记录(七)
  • 人工智能与机器学习在医学领域的应用
  • 结构型模式之外观模式
  • vue3状态管理库Pinia应用
  • C++入门基础知识28——关于【C++ 常量】
  • 论文阅读:MonoScene: Monocular 3D Semantic Scene Completion
  • Linux核心命令入门
  • 线性代数证明:把行列式的某一行(列)的k倍加到另一行(列),行列式的值不变
  • C++ TinyWebServer项目总结(7. Linux服务器程序规范)
  • ASIACRYPT 2021
  • Visual Studio VS 插件之 ReSharper
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 「面试题」如何实现一个圣杯布局?
  • 2017-09-12 前端日报
  • Druid 在有赞的实践
  • ES6语法详解(一)
  • ESLint简单操作
  • Laravel Telescope:优雅的应用调试工具
  • LintCode 31. partitionArray 数组划分
  • redis学习笔记(三):列表、集合、有序集合
  • ubuntu 下nginx安装 并支持https协议
  • Web标准制定过程
  • 笨办法学C 练习34:动态数组
  • 大主子表关联的性能优化方法
  • 给github项目添加CI badge
  • 给初学者:JavaScript 中数组操作注意点
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 微信小程序:实现悬浮返回和分享按钮
  • 详解NodeJs流之一
  • 在Unity中实现一个简单的消息管理器
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • "无招胜有招"nbsp;史上最全的互…
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (C#)一个最简单的链表类
  • (TOJ2804)Even? Odd?
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (顺序)容器的好伴侣 --- 容器适配器
  • (算法)求1到1亿间的质数或素数
  • (五)IO流之ByteArrayInput/OutputStream
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(九):替换带有等号=的字符串的子串