Odoo定时任务管理:GitHub_Trending/se/server-tools cron模块高级配置

Odoo定时任务管理:GitHub_Trending/se/server-tools cron模块高级配置

【免费下载链接】server-tools Tools for Odoo Administrators to improve some technical features on Odoo. 【免费下载链接】server-tools 项目地址: https://gitcode.com/GitHub_Trending/se/server-tools

在Odoo系统日常运维中,定时任务(Cron Job)的冲突、失败通知和精细化管理一直是管理员面临的痛点。本文将介绍如何利用GitHub_Trending/se/server-tools项目中的cron相关模块,实现定时任务的高级配置与优化,解决任务冲突、失败监控和执行效率问题。

1. 定时任务冲突解决方案:base_cron_exclusion模块

1.1 核心功能与实现原理

base_cron_exclusion模块通过为定时任务添加互斥关系管理,防止高资源消耗的任务同时执行。其核心实现位于base_cron_exclusion/models/ir_cron.py,通过重写ir.cron模型添加互斥字段和调度逻辑:

mutually_exclusive_cron_ids = fields.Many2many(
    comodel_name="ir.cron",
    relation="ir_cron_exclusion",
    column1="ir_cron1_id",
    column2="ir_cron2_id",
    string="Mutually Exclusive Scheduled Actions",
)

1.2 配置步骤

  1. 安装模块:在Odoo应用市场搜索base_cron_exclusion并安装
  2. 设置互斥关系:在定时任务表单中,通过"Mutually Exclusive Scheduled Actions"字段选择不能同时执行的任务
  3. 系统验证:模块内置验证逻辑防止自引用冲突:
    @api.constrains("mutually_exclusive_cron_ids")
    def _check_auto_exclusion(self):
        for item in self:
            if item in item.mutually_exclusive_cron_ids:
                raise ValidationError("You can not mutually exclude a scheduled actions with itself.")
    

1.3 任务调度锁定机制

系统在任务执行前通过_lock_mutually_exclusive_cron方法实现数据库级锁定:

@staticmethod
def _lock_mutually_exclusive_cron(db, job_id):
    lock_cr = db.cursor()
    lock_cr.execute("""
        WITH Q1 AS (SELECT ir_cron2_id as cron_id FROM ir_cron_exclusion
                        WHERE ir_cron1_id=%s
                    UNION ALL
                    SELECT ir_cron1_id as cron_id FROM ir_cron_exclusion
                        WHERE ir_cron2_id=%s)
            SELECT * FROM Q1 GROUP BY cron_id;""", (job_id, job_id))
    # 锁定相关任务防止并发执行
    locked_ids = tuple(row[0] for row in lock_cr.fetchall())
    if locked_ids:
        lock_cr.execute("""SELECT * FROM ir_cron WHERE active AND id IN %s FOR UPDATE NOWAIT""", (locked_ids,))

2. 定时任务失败监控:scheduler_error_mailer模块

2.1 失败通知机制

scheduler_error_mailer模块通过重写定时任务回调方法,实现失败通知功能。其核心代码位于scheduler_error_mailer/models/ir_cron.py

def _handle_callback_exception(self, cron_name, server_action_id, job_exception):
    # 异常捕获与邮件发送逻辑
    self.env["mail.mail"].create({
        "subject": f"Scheduled Action Failed: {cron_name}",
        "body_html": f"Error details: {str(job_exception)}",
        "email_to": self.env.user.email,
    }).send()

2.2 配置邮件模板

模块提供默认邮件模板,位于scheduler_error_mailer/data/ir_cron_email_tpl.xml,可通过Odoo设置-技术-邮件模板进行自定义修改。

2.3 测试验证

可通过单元测试验证通知功能,测试代码位于scheduler_error_mailer/tests/test_scheduler_error_mailer.py

def test_error_cron(self):
    with self.assertLogs("odoo.addons.scheduler_error_mailer.models.ir_cron", "DEBUG") as log_catcher:
        self.cron._handle_callback_exception(
            self.cron.name,
            self.cron.ir_actions_server_id.id,
            Exception("Test error"),
        )
    self.assertIn("Sending error email for cron", log_catcher.output[0])

3. 定时任务执行优化:性能监控与调优

3.1 数据库大小监控:database_size模块

database_size模块提供定时任务执行的数据库性能监控,通过database_size/data/ir_cron_data.xml定义的定时任务,定期收集模型大小数据:

<record id="ir_cron_ir_model_size_measure" model="ir.cron">
    <field name="name">Measure Models Size</field>
    <field name="model_id" ref="model_ir_model"/>
    <field name="code">model._measure_model_size()</field>
    <field name="interval_number">1</field>
    <field name="interval_type">days</field>
    <field name="numbercall">-1</field>
</record>

3.2 执行效率调优建议

  1. 任务分组执行:将关联任务按执行时段分组,通过base_cron_exclusion设置互斥关系
  2. 资源密集型任务调度:在ir_cron视图中调整执行时间,避开业务高峰期
  3. 执行频率优化:参考database_size模块的统计数据,对大数据量表的统计任务适当降低执行频率

4. 典型应用场景与最佳实践

4.1 电商平台任务调度方案

任务类型建议执行时间互斥任务监控配置
订单数据同步02:00-04:00库存更新、报表生成启用失败邮件通知
库存更新04:00-06:00订单数据同步启用失败邮件通知
销售报表生成06:00-08:00订单数据同步、库存更新启用失败邮件通知

4.2 配置检查清单

  1. ✅ 所有互斥任务已正确配置关系
  2. ✅ 关键任务已启用scheduler_error_mailer通知
  3. ✅ 定期通过database_size模块监控执行性能
  4. ✅ 避免在业务高峰期执行资源密集型任务

5. 总结与扩展

通过结合base_cron_exclusion、scheduler_error_mailer和database_size三个模块,可构建完整的定时任务管理体系。这些模块均遵循Odoo最佳实践,代码结构清晰,扩展方便。

如需进一步定制,可参考各模块提供的钩子方法和扩展点:

  • 任务执行前验证:重写_pre_execute方法
  • 自定义通知渠道:扩展scheduler_error_mailer_handle_callback_exception方法
  • 高级调度算法:修改base_cron_exclusion_lock_mutually_exclusive_cron逻辑

建议定期查看模块更新,项目地址:GitHub_Trending/se/server-tools

【免费下载链接】server-tools Tools for Odoo Administrators to improve some technical features on Odoo. 【免费下载链接】server-tools 项目地址: https://gitcode.com/GitHub_Trending/se/server-tools

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值