第二十一章 定时任务
篇别:第三篇 数据库与数据管理
本章学习目标
- 能配置
ir.cron:模型、方法、间隔、执行用户、并发语义。 - 能使用
base.automation实现 基于触发器 的自动化。 - 了解 Odoo 19 Cron 进度与分批提交 的设计方向(以官方文档为准)。
- 能规划 长任务 的锁、超时与监控,避免拖垮数据库。
导读:Cron 是「无人值守的 worker」
定时任务在 后台进程 中按 计划 调用 @api.model 方法,适合 同步、清理、提醒、批处理。与 用户点击 不同,Cron 使用 指定用户 身份,权限与记录规则 以该用户为准。
21.1 ir.cron
21.1.1 知识要点
| 字段 | 说明 |
|---|---|
name |
显示名 |
model_id / model_name |
目标模型(依版本) |
code 或 function + 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 中 < 需转义为 < 或使用 CDATA/ eval。
21.1.3 截图占位

21.1.4 本节练习
- 简答:多 worker 下同一 cron 是否会 并行双跑?如何缓解?
- 实操:将 cron 用户从 超级用户 改为 专用机器人用户,观察 权限错误(故意)。
- 判断:cron 中应使用
sudo()处理一切。( )
参考答案提示:1. 可能;用 排他锁、ir.cron 单实例、或队列。3. 错,应最小权限。
21.2 自动化动作(base.automation)
21.2.1 知识要点
触发:创建、更新、删除、基于时间、基于表单值等。
动作:执行 服务器动作、活动、Webhook(视模块)。
优势:低代码;劣势:复杂逻辑难测、难版本管理。
21.2.2 案例
规则:销售订单确认 → 创建活动 给财务。
或:图书记录 copy_count 低于阈值 → 内部消息。
21.2.3 截图占位

21.2.4 本节练习
- 实操:创建借阅单 时自动
message_post欢迎语。 - 简答:自动化与 重写 create 的选型?
参考答案提示:2. 自动化快;代码可控性与测试更好。
21.3 Odoo 19 新 Cron API(新增)
21.3.1 知识要点
新版本可能提供:进度回调、分批 commit、可中断 的长任务接口,避免 单事务锁表过久。
实现长批处理时:分批 search + commit(慎用) + 断点字段(如 last_processed_id)。
21.3.3 截图占位

21.3.4 本节练习
- 简答:长事务 cron 对 复制延迟 与 连接池 的影响?
- 拓展:搜索源码中
ir.cron与_notify_progress(或类似)关键字。
21.4 监控与告警
21.4.1 知识要点
- 日志中 traceback;
ir.logging。 - 外部:Prometheus、cron 失败邮件、Sentry(需自定义)。
21.4.2 本节练习
- 实操:故意让 cron 抛错,在日志中定位 第一次异常行。
本章综合练习
- 实现:每天 凌晨 归档 90 天前
TransientModel记录(查官方清理机制,避免手写删系统表)。 - 监控:设计 cron 失败 告警(邮件/webhook)文字方案。
- 容量:估算 10 万用户 每人一条 每日提醒 cron 的 DB 压力,提出 批处理 策略。
- 安全:cron 使用 admin 用户的风险与替代方案。
本章对应白皮书目录:第二十一章 定时任务。