第二十一章 定时任务

篇别:第三篇 数据库与数据管理

本章学习目标

  • 能配置 ir.cron:模型、方法、间隔、执行用户、并发语义。
  • 能使用 base.automation 实现 基于触发器 的自动化。
  • 了解 Odoo 19 Cron 进度与分批提交 的设计方向(以官方文档为准)。
  • 能规划 长任务 的锁、超时与监控,避免拖垮数据库。

导读:Cron 是「无人值守的 worker」

定时任务在 后台进程 中按 计划 调用 @api.model 方法,适合 同步、清理、提醒、批处理。与 用户点击 不同,Cron 使用 指定用户 身份,权限与记录规则 以该用户为准。


21.1 ir.cron

21.1.1 知识要点

字段 说明
name 显示名
model_id / model_name 目标模型(依版本)
codefunction + args 调用方法名(老新差异,以界面为准)
interval_number / interval_type 间隔
nextcall 下次运行时间(UTC)
user_id 执行用户;影响 sudo 与规则
active 是否启用
doall 是否补跑错过的次数(慎用)

方法签名:通常为 @api.model def cron_xxx(self):禁止依赖 self 为业务记录集。

21.1.2 案例

XML 定义(示意,字段名随版本调整)

<record id="ir_cron_library_cleanup" model="ir.cron">
  <field name="name">图书馆:清理过期预约</field>
  <field name="model_id" ref="model_library_reservation"/>
  <field name="state">code</field>
  <field name="code">model.cron_cleanup_expired()</field>
  <field name="interval_number">1</field>
  <field name="interval_type">days</field>
  <field name="user_id" ref="base.user_root"/>
  <field name="active" eval="True"/>
</record>
class LibraryReservation(models.Model):
    _name = 'library.reservation'

    @api.model
    def cron_cleanup_expired(self):
        expired = self.search([('expire_date', '<', fields.Date.today()), ('state', '=', 'draft')])
        expired.unlink()

XML 中 < 需转义为 &lt; 或使用 CDATA/ eval。

21.1.3 截图占位

图 21-1 计划动作表单

21.1.4 本节练习

  1. 简答多 worker 下同一 cron 是否会 并行双跑?如何缓解?
  2. 实操:将 cron 用户从 超级用户 改为 专用机器人用户,观察 权限错误(故意)。
  3. 判断:cron 中应使用 sudo() 处理一切。( )

参考答案提示:1. 可能;用 排他锁、ir.cron 单实例、或队列。3. 错,应最小权限。


21.2 自动化动作(base.automation)

21.2.1 知识要点

触发:创建、更新、删除、基于时间、基于表单值等。

动作:执行 服务器动作活动Webhook(视模块)。

优势:低代码;劣势:复杂逻辑难测、难版本管理。

21.2.2 案例

规则:销售订单确认创建活动 给财务。

或:图书记录 copy_count 低于阈值内部消息

21.2.3 截图占位

图 21-2 base.automation

21.2.4 本节练习

  1. 实操创建借阅单 时自动 message_post 欢迎语。
  2. 简答:自动化与 重写 create 的选型?

参考答案提示:2. 自动化快;代码可控性与测试更好。


21.3 Odoo 19 新 Cron API(新增)

21.3.1 知识要点

新版本可能提供:进度回调分批 commit可中断 的长任务接口,避免 单事务锁表过久

实现长批处理时:分批 search + commit(慎用) + 断点字段(如 last_processed_id)。

21.3.3 截图占位

图 21-3 官方 Cron 文档

21.3.4 本节练习

  1. 简答:长事务 cron 对 复制延迟连接池 的影响?
  2. 拓展:搜索源码中 ir.cron_notify_progress(或类似)关键字。

21.4 监控与告警

21.4.1 知识要点

  • 日志中 tracebackir.logging
  • 外部:Prometheuscron 失败邮件Sentry(需自定义)。

21.4.2 本节练习

  1. 实操:故意让 cron 抛错,在日志中定位 第一次异常行

本章综合练习

  1. 实现:每天 凌晨 归档 90 天前 TransientModel 记录(查官方清理机制,避免手写删系统表)。
  2. 监控:设计 cron 失败 告警(邮件/webhook)文字方案。
  3. 容量:估算 10 万用户 每人一条 每日提醒 cron 的 DB 压力,提出 批处理 策略。
  4. 安全:cron 使用 admin 用户的风险与替代方案。

本章对应白皮书目录:第二十一章 定时任务。