开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
背景
- 用户使用公告管理时,发布公告的发布时间设定在某个时间点后,没有在所设定的时间点发布公告,导致用户使用无法正常实现公告的定时发送。
- 设置每周具体哪一天可以自动通知用户,需要检查所有条件后然后再推送
分析
根据要求,可对任务可分为2种:
- 延时任务:到一定时间点推送任务后结束
- 定时任务:每此在设定的时间点时就会触发推送任务
这里推荐使用Quartz.net任务调度框架,理由如下:
-
Quartz.net是市面上比较成熟的框架
-
适用于集群环境
-
支持持久化,防止重启服务时任务中断
-
高可用,在集群环境中若某台服务器中断而不影响使用
-
支持可视化任务管理
方案
总体设计
- 新建表存储需要推送的消息,服务中启动一个调度任务线程Job,去遍历数据库将未处理的消息遍历,写入mq中;
- 其中Job工作主要是读取DB中的数据,判断是延时任务还是定时任务。如果是延时任务则写入mq中,并将此任务消息标志未已处理则结束;如果是定时任务则从DB中读取并写入MQ,同时此消息内容重置成下个时间点待执行。
- 定时任务是在全局配置中设置开启时写入数据库,全局配置设置不开启时,则将此任务状态置为已处理完毕
大概流程图:
详细设计
表设计
Schema:{
id //
type //类型
content //推送内容
globalSetting //全局中配置项
status //状态0-待执行,1-已执行
executedIP //执行ip
executedTime //执行时间
}
一个简单定时任务系统基本的设计,功能主要是对任务的定时调度执行。这样就可以完成基本的定时发送任务。