1. 概述
用户在开发完多个定时任务后,希望对存在业务上下游关联的定时任务设置调度策略,本文将详细介绍如何通过「定时调度」和「事件调度」保证多个定时任务的协调运行。
背景 | 场景 | 调度配置方式 |
---|---|---|
A、B、C、D 四个任务,其中 A、B、C 为 D 任务的上游,期望 A、B、C 任务运行完成且 A、B、C 之间的间隔时间小于 20 小时的情况下,D 可正常且不重复运行。 | A、B、C 任务设置每天定时运行一次 |
|
A、B 任务设置每天定时运行一次,C 任务设置 1 小时运行一次 |
| |
若 B 任务设置每天定时运行一次,A、C 任务设置每 1 小时运行一次 |
| |
A、B、C 任务设置每 1 小时运行一次 | 配置 D 任务在 A、B、C 运行后的一个固定时间运行:如 D 任务配置在 1:30 定时触发,A、B、C 在 20 小时内有运行记录。 |
2. 场景一
若有 A、B、C、D 四个任务,其中 A、B、C 为 D 任务的上游,且 A、B、C 任务设置每天定时运行一次。
期望在 A、B、C 任务均运行完成且任务间间隔时间小于 20 小时的情况下,D 任务能够正常运行且不会重复执行。
调度配置方法:
设置「当前任务组执行条件」为:
条件判断时机:实时判断;条件内容,上游任务在 20 小时内全部运行成功后,执行当前任务组,同时取消勾选「触发当前任务组执行的上游记录,不再参与条件的判断」,如下图所示:
注:是否勾选该选项对运行结果无实质影响,因 A 、B 、C 均仅执行一次,D 任务不会产生重复执行。
具体执行逻辑:当某上游任务(如 A)运行后,系统将回溯 20 小时查找其他上游任务(B 、C)的运行记录。若存在满足条件的记录则触发 D 任务,否则跳过本次触发。
3. 场景二
若 A 、B 任务设置每天定时运行一次,C 任务设置每小时运行一次。
期望在 A 、B 、C 任务均运行完成且任务间间隔时间小于 20 小时的情况下,D 任务能够正常执行且避免重复触发。
调度配置方式:
当「事件调度」任务保持场景二的设置:
条件判断时机:实时判断;条件内容,上游任务在 20 小时内全部运行成功后,执行当前任务组,同时取消勾选「触发当前任务组执行的上游记录,不再参与条件的判断」。
此时 D 任务的运行情况如下表:
任务名 | 运行时间 | |||||||
---|---|---|---|---|---|---|---|---|
A | 1:00 | |||||||
B | 1:30 | |||||||
C | 1:00 | 2:00 | 3:00 | 4:00 | 5:00 | 6:00 | .... | |
D | 不运行 B 任务的上一次运行时间在前一天 1:30, 20小时内 B 没有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 |
此时 D 任务一直在重复运行。
解决方法:
勾选「触发当前任务组执行的上游记录,不再参与后续条件判断」选项。
如下图所示:
此时 D 任务的运行情况如下表:
任务名 | 运行时间 | |||||||
---|---|---|---|---|---|---|---|---|
A | 1:00 | |||||||
B | 1:30 | |||||||
C | 1:00 | 2:00 | 3:00 | 4:00 | 5:00 | 6:00 | .... | |
D | 不运行 B 任务的上一次运行时间在前一天 1:30, 20小时内 B 没有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 不运行 20 小时内只有 C 任务运行记录 A、B 任务的运行记录均被上一次 D 任务运行消耗掉了 | 不运行 20 小时内只有 C 任务运行记录 A、B 任务的运行记录均被上一次 D 任务运行消耗掉了 | 不运行 20 小时内只有 C 任务运行记录 A、B 任务的运行记录均被上一次 D 任务运行消耗掉了 | 不运行 20 小时内只有 C 任务运行记录 A、B 任务的运行记录均被上一次 D 任务运行消耗掉了 | 不运行 20 小时内只有 C 任务运行记录 A、B 任务的运行记录均被上一次 D 任务运行消耗掉了 | 不运行 20 小时内只有 C 任务运行记录 A、B 任务的运行记录均被上一次 D 任务运行消耗掉了 |
4. 场景三
若 B 任务设置每天定时运行一次,A 、C 任务设置每小时运行一次。
期望在 A 、B 、C 任务均运行完成且任务间间隔时间小于 20 小时的情况下,D 任务能够正常执行且避免重复触发。
调度配置方式:
使用场景二配置方法即可,如下所示:
此时 D 任务的运行情况如下表:
任务名 | 运行时间 | |||||||
---|---|---|---|---|---|---|---|---|
A | 1:00 | 2:00 | 3:00 | 4:00 | 5:00 | |||
B | 1:30 | |||||||
C | 1:00 | 2:00 | 3:00 | 4:00 | 5:00 | 6:00 | .... | |
D | 不运行 B 任务的上一次运行时间在前一天 1:30, 20小时内 B 没有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 不运行 20 小时内只有 A、C 任务运行记录 B 任务的运行记录均被上一次 D 任务运行消耗掉了 | 不运行 20 小时内只有 A、C 任务运行记录 B 任务的运行记录均被上一次 D 任务运行消耗掉了 | 不运行 20 小时内只有 A、C 任务运行记录 B 任务的运行记录均被上一次 D 任务运行消耗掉了 | 不运行 20 小时内只有 A、C 任务运行记录 B 任务的运行记录均被上一次 D 任务运行消耗掉了 | 不运行 20 小时内只有 A、C 任务运行记录 B 任务的运行记录均被上一次 D 任务运行消耗掉了 | 不运行 20 小时内只有 A、C 任务运行记录 B 任务的运行记录均被上一次 D 任务运行消耗掉了 |
5. 场景四
若 A、B、C 任务设置每 1 小时运行一次。
希望在 A、B、C 任务运行完成且 A、B、C 之间的间隔时间小于 20 小时的情况下,D 可正常且不重复运行。
调度配置方式:
若使用场景二配置方法,则 D 任务的运行方式变成如下表:
任务名 | 运行时间 | ||||||
---|---|---|---|---|---|---|---|
A | 1:00 | 2:00 | 3:00 | 4:00 | 5:00 | 6:00 | |
B | 1:00 | 2:00 | 3:00 | 4:00 | 5:00 | 6:00 | |
C | 1:00 | 2:00 | 3:00 | 4:00 | 5:00 | 6:00 | .... |
D | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 | 运行 20 小时内 A、B、C 都有运行记录 |
此时 D 任务又开始重复运行了。这时候使用「实时判断」事件调度方式解决不了,那就需要配置「定时调度」。
最终调度配置方式:
配置 D 任务在 A、B、C 运行后的一个固定时间运行:如 D 任务配置在 1:30 定时触发,A、B、C 在 20 小时内有运行记录。
任务名 | 运行时间 | |||||||
---|---|---|---|---|---|---|---|---|
A | 1:00 | 2:00 | 3:00 | 4:00 | 5:00 | 6:00 | ||
B | 1:00 | 2:00 | 3:00 | 4:00 | 5:00 | 6:00 | ||
C | 1:00 | 2:00 | 3:00 | 4:00 | 5:00 | 6:00 | .... | |
D | 1:30 运行 20 小时内 A、B、C 都有运行记录 | 不运行 超过 1:30,即 D 任务的定时调度时间,不会触发调度 | 不运行 超过 1:30,即 D 任务的定时调度时间,不会触发调度 | 不运行 超过 1:30,即 D 任务的定时调度时间,不会触发调度 | 不运行 超过 1:30,即 D 任务的定时调度时间,不会触发调度 | 不运行 超过 1:30,即 D 任务的定时调度时间,不会触发调度 | 不运行 超过 1:30,即 D 任务的定时调度时间,不会触发调度 |

提示:
配置定时调度时需要注意:D 任务需要配置在 A、B、C 任务当天的最早运行时间结束之后。
注:定时调度配置错过时间即不再触发,配置过多不稳。
解决办法:配置定时调度时将检查时间设置长一点,比如1天。举例 A 运行时间1:00,B 运行时间1:30,C 运行时间2:00,设置 D 任务触发时间 1:20,如果就这么运行 1:20 时 B、C任务还没运行,D 任务会出问题。此时可以将 D 任务的触发时间改成 1 天,那么就会用到前一天的 B、C 任务的运行记录。D 任务可正常运行,只是数据为T+2。