常见技术问题

“计划的操作不会在预期的确切时间运行”

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

这可能是由于同一台服务器上可能存在多个客户,我们必须确保每个客户都能公平地使用服务器资源。因此,计划任务的实现方式与普通 Odoo 服务器略有不同,并且是按照 尽力而为 的策略来执行的。

警告

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

是否有关于计划操作的“最佳实践”?

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

我们建议:

  • 您计划执行的操作应针对小批量的记录进行。

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

  • Your scheduled actions should be idempotent: they must not cause side-effects if they are started more often than expected.

当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'