Delayed & Scheduled Jobs Cheatsheet

One-screen lookup. Cite: Delayed, Job Schedulers, Repeat Strategies, Manage.

Delayed — run one job later

await queue.add('x', data, { delay: 5000 });   // ~5s from now

// aim at a wall-clock time
const delay = Number(new Date('2035-07-03T10:30')) - Number(new Date());
await queue.add('x', data, { delay });

// reschedule while still delayed
const job = await queue.add('x', data, { delay: 2000 });
await job.changeDelay(4000);   // → 4s from now
delay = "at least", not "exactly". changeDelay only works while state is delayed.

Scheduled — the Job Scheduler (factory)

await queue.upsertJobScheduler(
  schedulerId,            // stable id — your key for update/remove
  repeat,                 // { every } | { pattern }  (+ options)
  { name, data, opts },   // job template (optional)
);
// → returns the FIRST job, in 'delayed' state

Repeat strategies — pick ONE

OptionMeaning
{ every: ms }Fixed interval, clock-aligned (not add-aligned).
{ pattern: 'cron' }cron-parser expression (5 or 6 fields).
Never combine every + pattern.

Cron fields

  s   m   h   DOM M   DOW      (s optional → 6-field form)
'0 0 9 * * 1-5'   = 9:00:00 Mon–Fri
'* * * * *'       = every minute
'0 0 0 L * *'     = midnight, last day of month
'0 0 0 * * 0'     = every Sunday midnight

Repeat options (all strategies)

OptionEffect
startDateNothing produced before this date.
endDateExpiry — stops producing after this.
limitMax repetitions; stops after N.
immediatelyFirst job runs now, not on next tick. (v5.19+)

Management

await queue.removeJobScheduler(id);          // true if existed
await queue.upsertJobScheduler(id, repeat);  // re-upsert = update
const all = await queue.getJobSchedulers(0, 100);  // paginated list

Gotchas

TrapWhat to do
No custom job idScheduler jobs get special ids; use name to tell them apart.
Cadence drifts under loadNext job emits only after previous one starts. Add workers / concurrency.
every not firing "2s after add"It's clock-aligned. Use immediately: true.
Old code uses { repeat }Legacy add(...,{repeat}) + removeRepeatableByKey. Use Job Schedulers for new code.

Mental model

NeedAPI
One job, lateradd(..., { delay })
Jobs on a scheduleupsertJobScheduler