xxl-job配置相同,执行顺序
问
两个任务,同一个执行执行器,相同时间,路由策略第一个,阻塞策略,单机串行,先执行哪个,按任务ID排序吗,先创建的任务先执行
答
在 XXL-JOB 或其他类似分布式任务调度系统中,如果配置以下条件:
同一个执行器
相同的 Cron 触发时间
路由策略为第一个(如
FIRST
)阻塞策略为单机串行(
SERIAL_EXECUTION
)
任务的执行顺序规则如下:
1. 执行顺序判定
(1) 默认情况:按任务 ID 升序执行
系统会从数据库查询 相同 Cron 时间 的任务列表,默认按任务 ID 排序(升序,即先创建的任务 ID 通常更小)。
先创建的任务(ID 较小)会优先被选中执行。
(2) 路由策略 FIRST
的作用
路由策略
FIRST
表示选择 第一个可用的执行器,但若所有任务都在同一个执行器上,则对顺序无影响。阻塞策略
SERIAL_EXECUTION
会强制同一执行器上的任务串行执行(前一个任务完成后,再执行下一个)。
2. 示例场景
假设有两个任务:
任务A:ID=100(先创建)
任务B:ID=101(后创建)
当它们的 Cron 时间同时到达时:
系统按任务 ID 排序,得到顺序
[任务A, 任务B]
。任务A 被优先执行,任务B 进入等待队列。
任务A 完成后,任务B 才开始执行。
3. 关键结论
顺序依赖任务 ID:先创建的任务 ID 通常更小,会优先执行。
单机串行保证:即使任务触发时间相同,也不会并发执行,而是严格串行。
路由策略影响有限:
FIRST
在单执行器场景下不改变顺序。
4. 注意事项
数据库查询顺序:部分系统可能支持自定义排序(如按优先级字段),但默认按任务 ID。
任务 ID 生成方式:如果是自增 ID,则先创建的任务 ID 更小;若为分布式 ID(如雪花算法),需检查生成规则。
如果需要明确控制顺序,建议:
通过 任务优先级 字段(如果调度系统支持)。
错开 Cron 时间(如
0 0 * * * ?
和1 0 * * * ?
)。使用 任务依赖 功能(如 XXL-JOB 的父子任务)。