Schedule functions to execute at specific times using cron expressions.
modules::cron::CronModule
Sample Configuration
- class : modules::cron::CronModule
config :
adapter :
class : modules::cron::RedisCronAdapter
config :
redis_url : ${REDIS_URL:redis://localhost:6379}
Configuration
The adapter to use for distributed locking. Defaults to modules::cron::KvCronAdapter. Use RedisCronAdapter for multi-instance deployments.
Adapters
modules::cron::KvCronAdapter
When running multiple engine instances, KvCronAdapter does not provide reliable distributed locking — the same cron job may execute on every instance simultaneously. Use RedisCronAdapter for multi-instance deployments.
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
Configuration
Duration in milliseconds for which a lock is held before it expires. Defaults to 30000 (30 seconds).
Key namespace used to store lock entries in the KV store. Defaults to cron_locks.
modules::cron::RedisCronAdapter
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}
Configuration
The URL of the Redis instance to use for distributed locking.
Trigger Type
This Module adds a new Trigger Type: cron.
Standard cron expression defining the schedule. Supports the following format: * * * * * *
│ │ │ │ │ │
│ │ │ │ │ └─── Day of week (0–6, Sun=0)
│ │ │ │ └───── Month (1–12)
│ │ │ └─────── Day of month (1–31)
│ │ └───────── Hour (0–23)
│ └─────────── Minute (0–59)
└─────────── Second (0–59)
Function ID for conditional execution. The engine invokes it with the cron event; if it returns false, the handler function is not called.
Show Trigger Event Payload
The following fields are passed to the handler function (and to condition_function_id if set) each time the trigger fires. The ID of the cron trigger that fired.
The time the job was scheduled to run, in RFC 3339 format.
The actual time the job began executing, in RFC 3339 format.
Sample Code
const fn = iii . registerFunction (
{ id: 'jobs::cleanupOldData' },
async ( event ) => {
console . log ( 'Running cleanup scheduled at:' , event . scheduled_time )
return {}
},
)
iii . registerTrigger ({
type: 'cron' ,
function_id: fn . id ,
config: { expression: '0 0 2 * * *' },
})
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_function (
RegisterFunctionMessage :: with_id ( "jobs::cleanupOldData" . into ()),
| event : Value | async move {
println! ( "Running cleanup scheduled at: {}" , event [ "scheduled_time" ]);
Ok ( json! ({}))
},
);
iii . register_trigger ( RegisterTriggerInput {
trigger_type : "cron" . into (),
function_id : "jobs::cleanupOldData" . into (),
config : json! ({ "expression" : "0 0 2 * * *" }),
}) ? ;
Common Cron Expressions
Expression Description 0 * * * * *Every minute 0 0 * * * *Every hour 0 0 0 * * *Every day at midnight 0 0 0 * * 0Every Sunday at midnight 0 0 2 * * *Every day at 2 AM 0 */5 * * * *Every 5 minutes 0 0 9-17 * * 1-5Every 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: