用途:cron worker 让已注册函数按周期性 cron 表达式运行,无需单独调度进程或系统 crontab。它不提供可调用的 cron::* 函数,全部能力就是 cron 触发类型,通过 worker SDK 的触发注册绑定,例如 iii.registerTrigger({ type: 'cron', function_id, config })。
安装与冲突:使用 iii worker add cron 安装。引擎内置的 iii-cron 也占用 cron 触发类型,必须先从引擎配置中移除 iii-cron 再启动该 worker,否则独立 worker 会拒绝启动。
执行行为:每次触发时,worker 可选地评估条件函数,通过配置的后端获取锁,然后调用目标函数,事件负载包含 trigger、job_id、scheduled_time 和 actual_time,便于处理函数观察时间漂移。
表达式语法:采用 Rust cron crate 方言,六或七字段:秒 分 时 日 月 星期 [年],年可选,首字段始终是秒。因此 0 */5 * * * * 表示每 5 分钟的第 0 秒触发,而 */5 * * * * * 表示每 5 秒触发。
锁后端:local 为默认,仅进程内有效,多实例部署下每个实例都可能触发同一任务;redis 使用 Redis 锁,跨集群单次触发必须使用它。锁 TTL 为 30 秒。
适用场景:函数需要周期性运行;需要递归清理、报告、维护或批量作业按 UTC cron 窗口触发;需要跨集群单次触发且可配置 redis 后端;希望通过 condition_function_id 条件性跳过某次调度。
限制:不暴露可调用函数,不要调用 cron::*;默认 local 后端是进程内的,多实例下不要依赖它实现单次触发;worker 不会补跑停机期间错过的运行,只从当前运行时刻安排下一个 UTC 触发时间;条件函数仅在返回显式 JSON false 时阻止触发,真值、null 或缺失结果都允许触发,条件出错则跳过该次触发;不支持五字段 crontab 表达式,必须包含秒字段;数据或流变更响应应使用相应的 state、stream、queue 或 event worker,cron 只按时钟触发。
绑定方式:先用 iii.registerFunction 注册处理函数,再注册触发器,expression 为必填且必须能解析。可将同一 function_id 绑定到多个具有不同 trigger id 的触发器,trigger id 会作为 job_id 出现在事件中,处理函数返回值被忽略。锁后端通过 worker cron 的中央配置项设置,用 adapter.name: local 用于单进程开发,adapter.name: redis 用于多实例单次调度。