
点击蓝字 关注我们
核心调
度架构
调度系统采用 Quartz 分布式调度组件,主要负责定时任务的启停操作。从整体设计上看,DolphinScheduler 中的“定时调度”并不直接参与任务执行,而是充当一个时间驱动的触发器:在指定时间点创建工作流实例,并将执行控制权交由 Master 进行统一调度和编排。这种解耦设计,是理解 DolphinScheduler 调度机制的核心前提。
调度系统的
整体工作方式
在系统架构层面,Quartz 负责解析 cron 表达式并在时间条件满足时触发调度任务。当触发发生后,Quartz 并不会直接调度 Worker 执行任务,而是调用 DolphinScheduler 中实现的 Quartz Job —— ProcessScheduleTask。该类继承自 QuartzJobBean,是所有定时调度逻辑的统一入口。
ProcessScheduleTask 的职责并不是“执行工作流”,而是完成一系列调度前置校验,并向工作流控制模块发起“调度触发请求”。真正的工作流实例创建、任务拆分与下发,均由 MasterServer 完成。这一设计保证了即使调度触发频繁,系统核心执行逻辑仍然集中在 Master 侧,避免调度层过度膨胀。
定时调度的
执行链路
当 cron 表达式匹配当前时间时,Quartz 会触发对应的调度任务,系统内部的执行流程如下所示:

在这一过程中,ProcessScheduleTask.executeInternal() 方法是关键执行点。该方法会依次校验调度是否存在、是否处于 ONLINE 状态,以及所绑定的工作流定义是否已上线。只有当调度与工作流定义同时满足可执行条件时,系统才会继续构建调度触发参数并提交执行请求。
这一层层校验机制确保了调度系统的“安全失败”特性:即使存在脏数据、误操作或配置变更,调度也不会盲目触发执行。
Crontab表达式
定时任务配置
在 DolphinScheduler 中,Crontab 表达式是定时调度的核心配置项,用于描述工作流实例的触发时间规则。需要注意的是,这里的 Crontab 并非 Linux 系统级 crontab,而是 Quartz Cron 表达式,其解析与调度完全由 Quartz 框架负责。
Crontab 表达式的作用仅限于“定义何时触发调度”。一旦表达式生效,Quartz 会在满足时间条件时回调 ProcessScheduleTask,后续流程便完全进入 DolphinScheduler 内部的工作流调度体系。因此,Cron 表达式本身并不感知工作流执行状态,也不直接控制任务运行逻辑。
在实际使用中,系统对 Crontab 的配置也施加了一定约束。例如,DolphinScheduler 不支持秒级调度,如果将 cron 表达式的秒位设置为 *,将导致每秒触发一次调度,这类配置会被视为非法或不被支持。此外,定时调度必须配置合理的起止时间,如果起止时间完全一致,调度在逻辑上将被视为无效。
但是,如果对于工作流的定时调度需要细化到秒级别,用户也可以在定时任务配置模块的 Crontab 表达式做限制,以满足自己的生产需求。可参考开发案例《Apache DolphinScheduler 限制秒级别的定时调度》。
定时调度的创建
与生效过程
从用户视角来看,定时调度通常通过 Web UI 完成。在 DolphinScheduler 中,调度与工作流定义存在强依赖关系:只有处于 ONLINE 状态 的工作流,才允许创建并启用定时调度。
当用户完成调度配置后,新建的调度默认处于“下线”状态。只有在明确执行“定时上线”操作后,调度才会被注册到 Quartz 中并开始生效。这一设计有效避免了配置未完成或误操作导致的调度误触发。
调度生命周期
与状态控制
DolphinScheduler 为定时调度引入了清晰的生命周期管理模型。
创建定时:初始状态为"下线"
定时上线:点击"定时上线"按钮使定时生效
定时下线:停止定时调度
可以看到,调度从创建开始,经历下线、上线、再次下线等状态变化,每一次状态切换都会同步影响 Quartz 中的调度注册情况。
在 ProcessScheduleTask.executeInternal()方法中,系统会:
Quartz 仅对 ONLINE 状态的调度进行触发,这使得调度启停可以在不影响工作流定义本身的前提下灵活控制。
从实现角度看,调度生命周期的控制点集中在 ProcessScheduleTask 触发前的状态校验逻辑中,这也是调度安全性的关键保障之一。
补数机制与
定时调度的关系
补数功能是 DolphinScheduler 调度体系中的重要扩展能力,系统支持历史数据补数,用于处理历史时间范围内的数据重算需求,包括:
串行补数:按时间范围依次执行
并行补数:同时执行多个日期的实例
依赖模式:触发下游依赖节点的补数
无论是串行补数、并行补数,还是基于依赖关系的补数,其本质都与定时调度一致:按照指定的逻辑时间创建工作流实例。
换言之,补数并不是一种“特殊执行模式”,而是定时调度模型在历史时间维度上的延伸。这种统一的设计使得补数任务在执行、监控和失败处理方面,与普通定时调度保持高度一致。
从整体来看,DolphinScheduler 的定时调度机制体现了明显的工程取舍。首先,系统选择 Quartz 作为底层调度引擎,而非自研时间轮或调度模块,显著降低了调度稳定性风险。其次,通过将 Quartz 的职责严格限制在“时间触发”层面,DolphinScheduler 避免了调度逻辑与工作流执行逻辑的耦合。
此外,调度执行过程中对状态与时间范围的多重校验,保证了系统在复杂生产环境下的可控性。时区支持的引入,则进一步提升了调度在多地域、多集群部署场景下的可用性。
总体而言,DolphinScheduler 的定时调度并非简单的 cron 包装,而是一套围绕工作流实例生命周期精心设计的触发体系。这也是其能够在大规模企业级场景中长期稳定运行的重要原因。




用户案例

迁移实战

发版消息

加入社区
关注社区的方式有很多:
同样地,参与Apache DolphinScheduler 有非常多的参与贡献的方式,主要分为代码方式和非代码方式两种。
非代码方式包括:
完善文档、翻译文档;翻译技术性、实践性文章;投稿实践性、原理性文章;成为布道师;社区管理、答疑;会议分享;测试反馈;用户反馈等。
代码方式包括:
查找Bug;编写修复代码;开发新功能;提交代码贡献;参与代码审查等。


你的好友秀秀子拍了拍你
并请你帮她点一下“分享”
