Schedule functions to execute at specific times using cron expressions.
Sample Configuration
- name : iii-cron
config :
adapter :
name : redis
config :
redis_url : ${REDIS_URL:redis://localhost:6379}
Configuration
The adapter to use for distributed locking. Defaults to kv. Use redis for multi-instance deployments.
Adapters
When running multiple engine instances, the kv adapter does not provide reliable distributed locking — the same cron job may execute on every instance simultaneously. Use the redis adapter for multi-instance deployments.
Built-in adapter using process-local locks. Suitable for single-instance deployments.
name : kv
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.
redis
Uses Redis for distributed locking to prevent duplicate job execution across multiple engine instances.
name : redis
config :
redis_url : ${REDIS_URL:redis://localhost:6379}
Configuration
The URL of the Redis instance to use for distributed locking.
Trigger Type
This Worker 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( "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 * * *" }),
metadata : None ,
}) ? ;
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 Worker uses distributed locking to ensure jobs execute only once: