docs/modules/module-cron.mdx
Schedule functions to execute at specific times using cron expressions.
modules::cron::CronModule
- class: modules::cron::CronModule
config:
adapter:
class: modules::cron::RedisCronAdapter
config:
redis_url: ${REDIS_URL:redis://localhost:6379}
Built-in adapter using process-local locks. Suitable for single-instance deployments.
class: modules::cron::KvCronAdapter
config:
lock_ttl_ms: 30000
lock_index: cron_locks
Uses Redis for distributed locking to prevent duplicate job execution across multiple engine instances.
class: modules::cron::RedisCronAdapter
config:
redis_url: ${REDIS_URL:redis://localhost:6379}
This Module adds a new Trigger Type: cron.
```
* * * * * *
│ │ │ │ │ │
│ │ │ │ │ └─── Day of week (0–6, Sun=0)
│ │ │ │ └───── Month (1–12)
│ │ │ └─────── Day of month (1–31)
│ │ └───────── Hour (0–23)
│ └─────────── Minute (0–59)
└─────────── Second (0–59)
```
iii.registerTrigger({ type: 'cron', function_id: fn.id, config: { expression: '0 0 2 * * *' }, })
</Tab>
<Tab title="Python">
```python
def cleanup_old_data(event):
print('Running cleanup scheduled at:', event['scheduled_time'])
return {}
iii.register_function({'id': 'jobs::cleanupOldData'}, cleanup_old_data)
iii.register_trigger({'type': 'cron', 'function_id': 'jobs::cleanupOldData', 'config': {'expression': '0 0 2 * * *'}})
iii.register_trigger(RegisterTriggerInput { trigger_type: "cron".into(), function_id: "jobs::cleanupOldData".into(), config: json!({ "expression": "0 0 2 * * *" }), })?;
</Tab>
</Tabs>
## Common Cron Expressions
| Expression | Description |
| -------------------- | ---------------------------------------------- |
| `0 * * * * *` | Every minute |
| `0 0 * * * *` | Every hour |
| `0 0 0 * * *` | Every day at midnight |
| `0 0 0 * * 0` | Every Sunday at midnight |
| `0 0 2 * * *` | Every day at 2 AM |
| `0 */5 * * * *` | Every 5 minutes |
| `0 0 9-17 * * 1-5` | Every hour from 9 AM to 5 PM, Monday to Friday |
## Distributed Execution
When running multiple iii Engine instances, the Cron Module uses distributed locking to ensure jobs execute only once:
```mermaid
sequenceDiagram
participant E1 as Engine1
participant R as Redis
participant E2 as Engine2
Note over E1,E2: Cron trigger fires at
scheduled time
E1->>R: Try acquire lock
E2->>R: Try acquire lock
R-->>E1: Lock acquired
R-->>E2: Lock unavailable
E1->>E1: Execute job
E1->>R: Release lock
Note over E2: Skip execution
(lock not acquired)