常见技术问题

“定时任务不能在预期的确切时间运行”

在Odoo.sh平台上,我们无法保证计划操作的确切运行时间。

这是因为在同一台服务器上可能有多个客户,我们必须为每个客户保证公平的服务器份额。因此,计划操作与常规Odoo服务器略有不同,并且采用 尽力而为 的策略运行。

警告

不要期望任何计划动作运行的频率超过每5分钟一次。

关于定时操作,有没有“最佳实践”?

Odoo.sh 始终限制计划操作(*即* crons)的执行时间。 因此,在开发自己的 crons 时,你必须牢记这一点。

我们建议:

  • 您的定时操作应该处理小批量的记录。

  • 您的定时操作应该在处理每个批次后提交它们的工作;这样,如果它们被时间限制中断,就不需要重新开始。

  • 您的定时操作应该是 幂等的 :如果它们比预期更频繁地启动,它们不应该引起副作用。

IP 地址变更时如何自动执行任务?

Odoo.sh 会通知项目管理员 IP 地址的变更。 此外,当生产实例的 IP 地址发生变化时,会向路径 /_odoo.sh/ip-change 发送一个 HTTP GET 请求,其中包含新的 IP 地址作为查询字符串参数 (new),以及之前的 IP 地址作为附加参数 (old)。

该机制允许在IP地址变更时应用自定义操作(例如,发送电子邮件、联系防火墙API、配置数据库对象等)

出于安全考虑,/_odoo.sh/ip-change 路由仅限平台内部访问,若通过其他方式访问,将返回 403 响应。

这是一个伪实现示例:

class IPChangeController(http.Controller):

    @http.route('/_odoo.sh/ip-change', auth='public')
    def ip_change(self, old=None, new=None):
        _logger.info("IP address changed from %s to %s", old, new)
        # Then perform whatever action required for your use case, e.g., update an
        # ir.config_parameter, send an email, contact an external firewall service's API, ...
        return 'ok'