用途:指导在 Frappe v14/v15/v16 中实现定时任务与后台作业。核心决策是选择 scheduler_events(hooks.py,按时间/间隔触发,任务必须无参数)还是 frappe.enqueue()(由代码触发,可传可序列化数据)。
主要能力:给出调度事件类型选择(all、hourly、daily、weekly、monthly 及 *_long 变体、cron 表达式),明确超过 5 分钟须用 *_long。frappe.enqueue 队列分 short、default(默认超时各 300s)与 long(1500s),要求显式指定 queue。还覆盖任务去重(job_id、is_job_enqueued)、enqueue_after_commit、逐条错误隔离与自链式分批处理超长任务。
使用方式:scheduler_events 中按 daily、cron 等键注册函数路径;修改 hooks.py 后必须运行 bench migrate。测试可用 bench --site mysite execute myapp.tasks.daily_cleanup、scheduler status/enable/trigger、bench console(now=True 同步执行),或通过 Setup > Scheduled Job Type 的 Run Now。监控用 Scheduled Job Log、bench rq-dashboard、show-pending-jobs、show-failed-jobs。
适用场景:每日清理、小时同步、周报邮件、用户触发的长任务、报表生成等。
限制:调度任务不接收参数,需借助设置或硬编码;作业以 Administrator 运行,需显式提交,按批次而非逐条提交;用户触发任务应使用 job_id 防重复;调度事件应保持轻量。版本差异:tick 间隔 v14 为 240s、v15/v16 为 60s;去重参数 v14 用 job_name,v15/v16 用 job_id;自定义队列仅 v15/v16 支持。