当前位置: 代码网 > it编程>编程语言>Java > RabbitMQ 实现延迟队列的两种方式(1)

RabbitMQ 实现延迟队列的两种方式(1)

2024年08月06日 Java 我要评论
1、看视频进行系统学习这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。2、读源码,看实战笔记,学习大神思路“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。

在电商项目中,当我们下单之后,一般需要 20 分钟之内或者 30 分钟之内付款,否则订单就会进入异常处理逻辑中,被取消,那么进入到异常处理逻辑中,就可以当成是一个延迟队列。

我买了一个智能砂锅,可以用来煮粥,上班前把素材都放到锅里,然后设置几点几分开始煮粥,这样下班后就可以喝到香喷喷的粥了,那么这个煮粥的指令也可以看成是一个延迟任务,放到一个延迟队列中,时间到了再执行。

公司的会议预定系统,在会议预定成功后,会在会议开始前半小时通知所有预定该会议的用户。

安全工单超过 24 小时未处理,则自动拉企业微信群提醒相关责任人。

用户下单外卖以后,距离超时时间还有 10 分钟时提醒外卖小哥即将超时。

很多场景下我们都需要延迟队列。

本文以 rabbitmq 为例来和大家聊一聊延迟队列的玩法。

整体上来说,在 rabbitmq 上实现定时任务有两种方式:

利用 rabbitmq 自带的消息过期和私信队列机制,实现定时任务。

使用 rabbitmq 的 rabbitmq_delayed_message_exchange 插件来实现定时任务,这种方案较简单。

两种用法我们分别来看。

1. 用插件

1.1 安装插件

首先我们需要下载 rabbitmq_delayed_message_exchange 插件,这是一个 github 上的开源项目,我们直接下载即可:

https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases

选择适合自己的版本,我这里选择最新的 3.9.0 版。

下载完成后在命令行执行如下命令将下载文件拷贝到 docker 容器中去:

docker cp ./rabbitmq_delayed_message_exchange-3.9.0.ez some-rabbit:/plugins

这里第一个参数是宿主机上的文件地址,第二个参数是拷贝到容器的位置。

接下来再执行如下命令进入到 rabbitmq 容器中:

dockerexec-it some-rabbit /bin/bash

进入到容器之后,执行如下命令启用插件:

rabbitmq-pluginsenablerabbitmq_delayed_message_exchange

启用成功之后,还可以通过如下命令查看所有安装的插件,看看是否有我们刚刚安装过的插件,如下:

rabbitmq-plugins list

命令的完整执行过程如下图:

ok,配置完成之后,接下来我们执行 exit 命令退出 rabbitmq 容器。然后开始编码。

1.2 消息收发

接下来开始消息收发。

首先我们创建一个 spring boot 项目,引入 web 和 rabbitmq 依赖,如下:

项目创建成功后,在 application.properties 中配置 rabbitmq 的基本信息,如下:

接下来提供一个 rabbitmq 的配置类:

这里主要是交换机的定义有所不同,小伙伴们需要注意。

这里我们使用的交换机是 customexchange,这是一个 spring 中提供的交换机,创建 customexchange 时有五个参数,含义分别如下:

交换机名称。

交换机类型,这个地方是固定的。

交换机是否持久化。

如果没有队列绑定到交换机,交换机是否删除。

其他参数。

最后一个 args 参数中,指定了交换机消息分发的类型,这个类型就是大家熟知的 direct、fanout、topic 以及 header 几种,用了哪种类型,将来交换机分发消息就按哪种方式来。

接下来我们再创建一个消息消费者:

打印一下消息内容即可。

接下来再写一个单元测试方法来发送消息:

在消息头中设置消息的延迟时间。

好啦,接下来启动 spring boot 项目,然后运行单元测试方法发送消息,最终的控制台打印日志如下:

从日志中可以看到消息延迟已经实现了。

2. dlx 实现延迟队列

2.1 延迟队列实现思路

我们可以把死信队列就当成延迟队列。

具体来说是这样:

假如一条消息需要延迟 30 分钟执行,我们就设置这条消息的有效期为 30 分钟,同时为这条消息配置死信交换机和死信 routing_key,并且不为这个消息队列设置消费者,那么 30 分钟后,这条消息由于没有被消费者消费而进入死信队列,此时我们有一个消费者就在“蹲点”这个死信队列,消息一进入死信队列,就立马被消费了。

这就是延迟队列的实现思路,是不是很简单?

2.2 案例

接下来通过一个简单的案例,来和大家演示一下延迟队列的具体实现。

首先准备好一个启动的 rabbitmq。

然后我们创建一个 spring boot 项目,引入 rabbitmq 依赖:

然后在 application.properties 中配置一下 rabbitmq 的基本连接信息:

接下来我们来配置两个消息队列:一个普通队列,一个死信队列:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、oppo等大厂,18年进入阿里一直到现在。

深知大多数java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注java获取)

img

最后我们该如何学习?

1、看视频进行系统学习

这几年的crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去b站进行学习,b站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:

1年半经验,2本学历,curd背景,竟给30k,我的美团offer终于来了

2、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

spring源码深度解析:

1年半经验,2本学历,curd背景,竟给30k,我的美团offer终于来了

mybatis 3源码深度解析:

1年半经验,2本学历,curd背景,竟给30k,我的美团offer终于来了

redis学习笔记:

1年半经验,2本学历,curd背景,竟给30k,我的美团offer终于来了

spring boot核心技术-笔记:

1年半经验,2本学历,curd背景,竟给30k,我的美团offer终于来了

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

1年半经验,2本学历,curd背景,竟给30k,我的美团offer终于来了

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》
图片转存中…(img-chtyayox-1713272501907)]

mybatis 3源码深度解析:

[外链图片转存中…(img-obhkoqt5-1713272501907)]

redis学习笔记:

[外链图片转存中…(img-nchpqxy6-1713272501907)]

spring boot核心技术-笔记:

[外链图片转存中…(img-8zttwqyl-1713272501908)]

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

[外链图片转存中…(img-d2go0kqq-1713272501908)]

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com