技術設定に関するよくある質問

"スケジュールされたアクションが、予定通りの時間通りに実行されない"

Odoo.shプラットフォーム上では、スケジュールされたアクションの正確な実行時間は保証できません。

これは、同じサーバに複数の顧客が存在する可能性があるためであり、すべての顧客に対して公平なサーバの共有を保証する必要があります。そのため、スケジュールされたアクションは、通常の Odoo サーバとは若干異なる方法で実装され、最善の努力 ポリシーに基づいて実行されます。

警告

スケジュールされたアクションが5分より短い間隔で実行されることは期待しないで下さい。

スケジュールされたアクションに関する "ベストプラクティス" は?

Odoo.shは、スケジュールされたアクション(*別名* cron)の実行時間を常に制限しています。 そのため、独自のcronを開発する際には、この事実を念頭に置いておく必要があります。

アドバイス:

  • スケジュールされたアクションは、レコードの小規模なバッチに対して実行されるべきです。

  • スケジュールされたアクションは、各バッチを処理した後で作業を確定して下さい。そうすれば、時間制限によって中断された場合でも、最初からやり直す必要がありません。

  • スケジュールされたアクションは 冪等(idempotent) <https://stackoverflow.com/a/1077421/3332416> であるべきです。つまり、想定よりも頻繁に開始されたとしても、副作用を引き起こしてはなりません。

IPアドレスが変更された際に、タスクを自動化するには?

Odoo.shはプロジェクト管理者にIPアドレスの変更を通知します。 さらに、プロダクトインスタンスのIPアドレスが変更された場合、新しいIPアドレスがクエリー文字列パラメータ (new) として追加され、以前のIPアドレスが追加パラメータ (old) として含まれるパス /_odoo.sh/ip-change に対してHTTP GET リクエストが実行されます。

このメカニズムにより、IPアドレスの変更に応じてカスタムアクションを適用することができます(例えば、Eメールの送信、ファイアウォール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'