更新
前文 调度系统中不同周期任务依赖的方法(2)中我们对周期不固定作业的依赖提供了解决方法,通过一个 DependencyBuilder
可以准确找到父任务的调度时间,精确到秒。但是我们忽略一种情况,当父作业的 cron 表达式修改时,比如天级任务,从 2 点提前到 1 点运行,这时历史运行成功的记录对于子作业来说,还是否有效?这时,通过 DependencyBuilder
根据最新的 cron 表达式计算出来的调度时间跟修改之前是不一样的,意味了子任务无法检测到依赖而一直处于等待。
解决
例如 A -> B, B 依赖 A,如果这两个任务都是天级任务,且用户在修改 A 任务时,B 已经运行结束,那么到了第二天,B 任务会等待并检测到 A 新的调度时间,是没有问题的。有问题的是修改 A 的时候依赖它的任务还未执行完,由于我们提供的是一个作业修改会对调度实时生效,即是种动态的调度,依赖任务出现依赖失效。
对于这个棘手的问题,作者首先想到的是如果是后一种情况,就自动将任务运行一次,根据新的 cron 表达式产生一个新的调度时间,但是这个提议遭到了产品抵制,想到可能这个任务十分耗时,运行一次也是种资源浪费。于是作者不得不面临再一次地小重构。
其实如果历史成功记录有效的隐含意思是,修改后的任务前后有相同的数据时间,比如 A 任务从 2 点提前开 1 点执行,它们对应的数据时间范围都是前一天,之前我们一直在努力地想找到父任务的调度时间,换一下,用数据时间是更好的选择。因此,我们在上篇的基础上,计算出父级任务的调度时间后,然后计算出对应的数据时间跟历史成功记录匹配来检查依赖。
网友评论