[奇思异想]使用RabbitMQ实现定时任务
- 作者: 五速梦信息网
- 时间: 2026年04月04日 13:58
背景
工作中经常会有定时任务的需求,常见的做法可以使用Timer、Quartz、Hangfire等组件,这次想尝试下新的思路,使用RabbitMQ死信队列的机制来实现定时任务,同时帮助再次了解RabbitMQ的死信队列。
交互流程 
1. 用户创建定时任务
2. 往死信队列插入一条消息,并设置过期时间为首个任务执行时间
3. 死信队列中的消息过期后,消息流向工作队列
4. 任务执行消费者监听工作队列,工作队列向消费者推送消息
5. 消费者查询数据库,读取任务信息
6. 消费者确认任务有效(未被撤销),执行任务
7. 消费者确认有下个任务,再往死信队列插入一条消息,并设置过期时间为任务执行时间
8. 重复2-7的步骤,直到所有任务执行完成或任务撤销
环境准备请自行完成MongoDB和RabbitMQ的安装,Windows、Linux、Docker皆可,以下提供Windows的安装方法:
核心代码1. (WebApi)创建任务,并根据设置创建子任务,把任务数据写入数据库
2. (WebApi)往死信队列中写入消息
其中:
PendingTask为死信队列Exchange,死信队列的队列名(Queue Name)会包含Task、index、timeFlag的信息,帮助跟踪队列和子任务,同时也起到唯一标识的作用。
task.id为任务Id
index为子任务下标
timeFlag为子任务执行时间
3. (消费者)处理消息
4. (WebApi)撤销任务,更新任务状态即可
效果展示1. 先使用控制台把消费者启动起来。

2. 创建任务
启动WebApi,创建一个任务,开始时间为2019-07-16T07:55:00.000Z,结束时间为2019-07-16T07:59:00.000Z,执行时间间隔1分钟:

任务与相应的子任务也写入了MongoDB,这里假设子任务可能是邮件发送任务:

创建了一个临时死信队列,队列名称包含任务Id,子任务下标、以及子任务执行时间,并往其写入一条消息:

3. 执行(子)任务
从日志内容可以看出,(子)任务正常执行:

子任务状态也标注为已发送

同时也往消息队列写入了下一个子任务的消息:

4. 撤销任务

任务状态被置为已撤销:

任务没再继续往下执行:

消息队列中的临时队列被删除,消息也被消费完

- 上一篇: [使用多仓库解决] idea maven 下载源码出现:Cannot download sources Sources not found for: xxx
- 下一篇: [每日Linux]Linux下xsell和xftp的使用
相关文章
-
[使用多仓库解决] idea maven 下载源码出现:Cannot download sources Sources not found for: xxx
[使用多仓库解决] idea maven 下载源码出现:Cannot download sources Sources not found for: xxx
- 互联网
- 2026年04月04日
-
[收藏]NET技术+25台服务器怎样支撑世界第54大网站
[收藏]NET技术+25台服务器怎样支撑世界第54大网站
- 互联网
- 2026年04月04日
-
[书籍翻译] 《JavaScript并发编程》第七章 抽取并发逻辑
[书籍翻译] 《JavaScript并发编程》第七章 抽取并发逻辑
- 互联网
- 2026年04月04日
-
[每日Linux]Linux下xsell和xftp的使用
[每日Linux]Linux下xsell和xftp的使用
- 互联网
- 2026年04月04日
-
[零] Java 语言运行原理 JVM原理浅析 入门了解简介 Java语言组成部分 javap命令使用
[零] Java 语言运行原理 JVM原理浅析 入门了解简介 Java语言组成部分 javap命令使用
- 互联网
- 2026年04月04日
-
[开源]在iOS上实现Android风格的控件Toast
[开源]在iOS上实现Android风格的控件Toast
- 互联网
- 2026年04月04日






