延时消息_一文玩转消息中间件rabbitmq延时消息(附带源码)

news/2024/7/8 2:40:33
6dc4e35c811b751cb8398fcbf91b4241.png

我是码农小胖哥,之前探讨了springboot 集成 rabbitmq 以及开启ack模式

传送门:10分钟就能轻松入门消息中间件rabbitmq(附带教学源码)

接着该搞一下死信队列了

  • 业务场景

有时候 我们可能有些场景,不能让消费方那么快拿到消息。比如 10分钟后再告知对方消息。

还有如果消息超过一定时间没有消费我们把它转移到其他逻辑上去。

看过《让子弹飞》的都知道里面有句经典的台词:让子弹飞一会儿! 没错就是这个意思 ,让兔子再跑一会儿!

af1488205449e8b39f6e53d21db51f56.png
  • 概念
a43f678e7fc1cfa920ee57cfeaf7ca54.png

死信队列 ,听上去像 消息“死”了, 其实也有点这个意思,死信队列是当消息在一个队列 因为下列原因:

  1. 消息被拒绝(basic.reject/ basic.nack)并且不再重新投递 requeue=false
  2. 消息超期 (rabbitmq Time-To-Live -> messageProperties.setExpiration())
  3. 队列超载

变成了 “死信” 后 ,被重新投递(publish)到另一个Exchange , 该Exchange 就是DLX , 然后该Exchange 根据绑定规则 转发到对应的某个队列上, 监听该队列就可以重新消费。, 说白了 就是 没有被消费的消息 换个地方重新被消费。流程大致如下:

生产者 --> 消息 --> 交换机 --> 队列 --> 变成死信 --> DLX交换机 -->队列 --> 消费者

  • springboot rabbitmq 死信队列实践(认真看注释)

下面我们模拟一个死信队列的应用场景: 消息延时处理

还是以这个项目为基础: https://gitee.com/felord/springboot-message

项目中 RabbitConfig 死信相关片段:

 /** * 死信队列跟交换机类型没有关系 不一定为directExchange 不影响该类型交换机的特性. * * @return the exchange */ @Bean("deadLetterExchange") public Exchange deadLetterExchange() { return ExchangeBuilder.directExchange("DL_EXCHANGE").durable(true).build(); } /** * 声明一个死信队列. * x-dead-letter-exchange 对应 死信交换机 * x-dead-letter-routing-key 对应 死信队列 * * @return the queue */ @Bean("deadLetterQueue") public Queue deadLetterQueue() { Map args = new HashMap<>(2);// x-dead-letter-exchange 声明 死信交换机 args.put(DEAD_LETTER_QUEUE_KEY, "DL_EXCHANGE");// x-dead-letter-routing-key 声明 死信路由键 args.put(DEAD_LETTER_ROUTING_KEY, "KEY_R"); return QueueBuilder.durable("DL_QUEUE").withArguments(args).build(); } /** * 定义死信队列转发队列. * * @return the queue */ @Bean("redirectQueue") public Queue redirectQueue() { return QueueBuilder.durable("REDIRECT_QUEUE").build(); } /** * 死信路由通过 DL_KEY 绑定键绑定到死信队列上. * * @return the binding */ @Bean public Binding deadLetterBinding() { return new Binding("DL_QUEUE

http://www.niftyadmin.cn/n/4334231.html

相关文章

我的建站经历(一)

转载自我的博客:https://blog.ljyngup.com 我的建站经历(一) 我建站时的状况为&#xff1a; 1.学生党 2.未满十八岁 3.预算不高(大约200左右) 4.不想花太多精力在建站上&#xff0c;想快速建站开始写博客。 5.不以盈利为目的(以后发展好了另说) 6.想拥有一个属于自己的…

调用登录_SpringSecurity在前后端分离项目中自定义登录及源码分析

课纲自定义登录流程源码分析常见问题总结登录功能背景项目登录功能在没有使用SpringSecurity之前&#xff0c;流程如下&#xff1a;用户输入用户名和密码并提交到Controller在Controller层调用service层校验是否正确如果正确&#xff0c;将用户信息写入session返回用户的json数…

es6新的方法

var o {a:1}Object.keys(o); //返回对象自身的所有可枚举的属性的键名Object.assign() //忽略不可枚举的属性&#xff0c;只拷贝对象自身的可枚举属性Array.from() //将类似数组的对象&#xff0c;不管对象有没有部署iterator接口&#xff0c;转化为真正的数组[...arrayLik…

从远程主机断开连接_在外的同事们,远程连接不进公司的服务器,我拿什么来拯救你?...

我们公司大概有五个业务员是比较自由的&#xff0c;平时不是在日本就是在美国&#xff0c;要么就是在飞机和火车上&#xff0c;世界之大&#xff0c;哪里都有她们的去处。为了他们&#xff0c;我们专门设置了一台远程服务器供她们使用&#xff0c;主要的功能是通过远程进来使用…

P1158 导弹拦截

P1158 导弹拦截 思路&#xff1a; 按每个点到第一个系统的距离排序&#xff0c;然后预处理出每个点及其之后的点到第二个系统的距离的最大值&#xff0c;再循环一遍枚举答案。 代码&#xff1a; 1 #include <cstdio>2 #include <iostream>3 #include <algorithm…

前端png转pdf_有备无患,轻量在线PDF工具,能上网就能用

正式办公环境下&#xff0c;大家可能有 Adobe / MS Office / Foxit 之类一堆PDF工具可用。 不过有时出差在外&#xff0c;面对一台新的 PC/Mac&#xff0c;或者手机上临时要处理一下 PDF。要么时间紧迫来不及&#xff0c;要么连安装软件的权力也未必有&#xff0c;这时往往比较…

用自己的电脑搭云服务器吗_用别人的芯片,做自己的X86服务器:国内浪潮第一,华为第二...

众所周知&#xff0c;在PC领域&#xff0c;X86架构的芯片是一家独大的&#xff0c;虽然目前也有一些厂商想要向X86架构发起挑战&#xff0c;比如华为去年推出了鲲鹏主板&#xff0c;想将鲲鹏920用于PC&#xff0c;但就目前来讲&#xff0c;还需要很长时间。所以一直以来&#x…

怎么定义int_Java方法到底怎么写!快看我!

Snoopy 煜钊读完需要7分钟速读仅需 3 分钟在学习 Java 的过程中&#xff0c;我们经常会对方法的设计有些迷茫&#xff0c;怎么取名&#xff0c;怎么传参&#xff0c;怎么得到返回值。甚至有的小伙伴并不懂上面这些术语&#xff0c;用你们的话来讲&#xff1a;诶&#xff0c;我这…