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

在定时任务系统基础上支持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的支持。

结语


对于做这样一个结合,我们可以统一任务系统的调度,规范定时任务系统的日志。在我们的游戏框架中,我们做到了普通定时任务周期性定时任务持久化定时任务三者的规范统一实现,统一记录日志以及监控执行误差,很好的支撑了游戏所需的定时任务系统

你可能感兴趣的:(在定时任务系统基础上支持Crontab Job)