在定时任务系统基础上支持Crontab Job

前言
上一篇我们提到如何设计一个简单高效的定时任务系统,但这套系统并不支持周期性任务,我们最熟知的周期性定时任务系统,莫过于CrontabJob
. 在Java里面有Quartz
,.Net也有的啊,但如何把二者结合呢?
实现思路
经过查询Quartz的实现,我发现我需要的就是它对Crontab表达式
的解析逻辑,这个是整个调度系统的核心,它最核心的逻辑就是GetTimeAfter
获取相对于当前之间下一次的触发时间。那我们需要做的就变成了:
- 封装一个
CronJob
,它的表达式就是Crontab表达式
- 将CronJob包装成上一篇讲的
SimpleTimerTask
- 每次任务触发后,获取下一次触发时间,再次添加一个定时任务

几个关键类的说明
-
CronExpression
完成对Crontab表达式的解析,这个类取自开源项目Quartz.Net,代码地址如下:源码地址。开源项目经过多年的打磨沉淀,对这个表达式的支持是非常完整的。借用它的实现稳定可靠 -
JobScheduler
用来添加CrontabJob。里面有一个上一篇的SimpleTimer
,用来具体调度定时任务 -
JobTrigger
是CronJob的具体封装,可以方便的获取下一次触发时间,TriggerNext
用于刷新下一次触发时间 -
JobTriggerWrapper
是一个内部类,是对JobTrigger的包含,并且继承了SimpleTimerTask
用于可以在Timer中调度,他的Execute
中有一段关键的代码,用于触发之后再次调度
public void Execute()
{
try
{
// 执行任务
_context.Executor.Execute(_trigger, _context);
}
finally
{
// 添加下一次任务
_trigger.TriggerNext();
_timer.Schedule(new JobTriggerWrapper(_trigger, _context, _timer));
}
}
至此我们完成了我们的定时任务系统对CrontabJob的支持。
结语
对于做这样一个结合,我们可以统一任务系统的调度,规范定时任务系统的日志。在我们的游戏框架中,我们做到了普通定时任务
,周期性定时任务
,持久化定时
任务三者的规范统一实现,统一记录日志以及监控执行误差,很好的支撑了游戏所需的定时任务系统
网友评论