Recurring (cron) jobs
A recurring job runs on a schedule with no payload. Include
Zeridion::Flare::RecurringJob, give it a cron expression, and implement the
single-argument #perform(ctx):
require "zeridion_flare/worker"
class NightlyCleanup
include Zeridion::Flare::RecurringJob
flare_options cron: "0 3 * * *", queue: "maintenance", timezone: "UTC"
def perform(ctx)
PurgeExpired.run
end
end
Note the signature — recurring jobs receive only ctx, no payload.
How it runs
The worker announces each recurring schedule when it starts: the job type,
the cron expression, the queue, and the timezone. The server owns the clock —
on each tick it enqueues an execution, which the worker then picks up and runs
through #perform(ctx) like any other job.
flare_options for recurring jobs
| Option | Default | Meaning |
|---|---|---|
cron: | — (required) | The cron expression, e.g. "0 3 * * *" for 03:00 daily. |
timezone: | "UTC" | IANA timezone the cron is evaluated in. |
job_type: | the class's fully-qualified name | Routing key. |
queue: | "default" | Queue the executions are served on. |
max_attempts: | 3 | Attempt ceiling. |
timeout: | 1800 | Per-execution timeout, in seconds. |
Always set the timezone for non-UTC schedules
timezone: defaults to "UTC". If your cron is meant to fire at a local wall
time — say 03:00 in New York — set it explicitly:
flare_options cron: "0 3 * * *", queue: "maintenance", timezone: "America/New_York"
Without the right timezone the schedule fires at the wrong local time. The timezone travels with the schedule when the worker announces it.
Idempotency still applies
Recurring executions are delivered at-least-once like every job. If a tick must
run exactly once, dedupe on ctx.job_id.