(给DotNet加星标,提升.Net技能)
转自:编程玩家 cnblogs.com/Erik_Xu/p/10631633.html
一、背景
工作中经常会有定时任务的需求,常见的做法可以使用Timer、Quartz、Hangfire等组件,这次想尝试下新的思路,使用RabbitMQ死信队列的机制来实现定时任务,同时帮助再次了解RabbitMQ的死信队列。
二、交互流程
1. 用户创建定时任务
2. 往死信队列插入一条消息,并设置过期时间为首个任务执行时间
3. 死信队列中的消息过期后,消息流向工作队列
4. 任务执行消费者监听工作队列,工作队列向消费者推送消息
5. 消费者查询数据库,读取任务信息
6. 消费者确认任务有效(未被撤销),执行任务
7. 消费者确认有下个任务,再往死信队列插入一条消息,并设置过期时间为任务执行时间
8. 重复2-7的步骤,直到所有任务执行完成或任务撤销
三、环境准备
请自行完成MongoDB和RabbitMQ的安装,Windows、Linux、Docker皆可,以下提供Windows的安装方法:
MongoDB:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/
RabbitMQ:https://www.rabbitmq.com/install-windows.html
四、核心代码
1、(WebApi)创建任务,并根据设置创建子任务,把任务数据写入数据库
var task = new Task
{
Name = form.Name,
StartTime = form.StartTime,
EndTime = form.EndTime,
Interval = form.Interval,
SubTasks = new List()
};var startTime = task.StartTime;var endTime = task.EndTime;while ((endTime - startTime).TotalMinutes >= 0)
{
var sendTime = startTime;if (sendTime <= endTi