10 Oktober 2026

Scheduled action Odoo: bikin cron yang tidak bikin server hang

Scheduled action (ir.cron) jalan di worker background. Cron yang jelek menahan lock database dan memblokir user.

Definisikan

<record id="cron_sync_prices" model="ir.cron">
    <field name="name">Sync prices</field>
    <field name="model_id" ref="product.model_product_template"/>
    <field name="state">code</field>
    <field name="code">model._cron_sync_prices()</field>
    <field name="interval_number">1</field>
    <field name="interval_type">days</field>
</record>

Kerjakan per batch

@api.model
def _cron_sync_prices(self, batch=200):
    todo = self.search([('price_dirty', '=', True)], limit=batch)
    for rec in todo:
        rec._sync_price()
    if len(todo) == batch:
        self.env.ref('mymodule.cron_sync_prices')._trigger()
    self.env['ir.cron']._commit_progress(len(todo))  # Odoo 18+

_trigger() menjadwalkan run berikutnya segera, jadi satu run tidak menahan transaksi raksasa.

Aturan

  • Buat idempotent. Jalan dua kali tidak boleh menghitung ganda.
  • Jangan loop semua record tanpa limit.
  • Catat jumlah record yang diproses.
  • Tes dari Settings → Technical → Scheduled Actions → Run Manually.

← Semua tulisan