Recurring work, named.
The managed alternative to a repeat option buried in a job: a named schedule you can update in place and remove by id.
Job Schedulers (Repeatable Jobs)
Section titled “Job Schedulers (Repeatable Jobs)”Named, updatable schedules (the managed alternative to repeat in job options):
await queue.upsertJobScheduler('daily-report', { pattern: '0 9 * * *', // cron pattern // or: every: 3600000, // interval in ms}, { name: 'generate-report', data: { type: 'daily' },});
const scheduler = await queue.getJobScheduler('daily-report');const schedulers = await queue.getJobSchedulers(0, 99, true);const count = await queue.getJobSchedulersCount();await queue.removeJobScheduler('daily-report');await queue.upsertJobScheduler('daily-report', { pattern: '0 9 * * *', // cron pattern // or: every: 3600000, // interval in ms}, { name: 'generate-report', data: { type: 'daily' },});
const scheduler = await queue.getJobScheduler('daily-report');const schedulers = await queue.getJobSchedulers();const count = await queue.getJobSchedulersCount();await queue.removeJobScheduler('daily-report');queue.upsert_job_scheduler( "daily-report", {"pattern": "0 9 * * *"}, # or {"every": 3600000} {"name": "generate-report", "data": {"type": "daily"}},)
scheduler = queue.get_job_scheduler("daily-report")schedulers = queue.get_job_schedulers()count = queue.get_job_schedulers_count()queue.remove_job_scheduler("daily-report")$queue->upsertJobScheduler('daily-report', ['pattern' => '0 9 * * *'], // or ['every' => 3600000] ['name' => 'generate-report', 'data' => ['type' => 'daily']],);
$scheduler = $queue->getJobScheduler('daily-report');$schedulers = $queue->getJobSchedulers();$queue->removeJobScheduler('daily-report');queue.UpsertJobScheduler("daily-report", bunqueue.SchedulerRepeat{Pattern: "0 9 * * *"}, // or EveryMs: 3600000 bunqueue.SchedulerTemplate{ Name: "generate-report", Data: map[string]any{"type": "daily"}, },)
scheduler, _ := queue.GetJobScheduler("daily-report")schedulers, _ := queue.GetJobSchedulers()queue.RemoveJobScheduler("daily-report")use bunqueue_client::{SchedulerRepeat, SchedulerTemplate};
queue.upsert_job_scheduler( "daily-report", SchedulerRepeat { pattern: Some("0 9 * * *".into()), ..Default::default() }, SchedulerTemplate { name: Some("generate-report".into()), ..Default::default() },)?;
let scheduler = queue.get_job_scheduler("daily-report")?;queue.remove_job_scheduler("daily-report")?;:ok = Bunqueue.Queue.upsert_scheduler(queue, "daily-report", %{pattern: "0 9 * * *"}, # or %{every: 3_600_000} %{name: "generate-report", data: %{type: "daily"}} )
{:ok, scheduler} = Bunqueue.Queue.get_scheduler(queue, "daily-report"){:ok, schedulers} = Bunqueue.Queue.list_schedulers(queue):ok = Bunqueue.Queue.remove_scheduler(queue, "daily-report")The Bun client orders schedulers by their next execution time. Pagination uses
zero-based inclusive start and end offsets, so (0, 99) returns at most 100
entries; end: -1 means the rest of the list. asc defaults to false.
Schedulers with the same next execution time are ordered deterministically by
ID in the same direction.
Scheduler IDs are global to the broker. The Bun client applies prefixKey to
the ID automatically; external SDKs do not, so prefix IDs explicitly when
applications share a server. TypeScript and Python filter scheduler lists to
the current queue. PHP, Go, and Elixir currently return the broker-wide list,
so filter its queue field in application code. Rust exposes get/remove but no
list or count helper yet.
Where to go next
Section titled “Where to go next”| Cron Jobs | The scheduling guide these schedulers belong to |
| Cron Recipes | Intervals, timezones, repeat-after-completion |
| Cron Expressions & Options | Every field of a cron pattern, and the options |
| Queue API | Create a queue in embedded or TCP mode |
| Adding Jobs | add, addBulk, priorities, delays, durability |
| Deduplication and Idempotent Job Adds | Idempotent adds, dedup keys, custom job ids |
| Querying Jobs | Fetch jobs, states, counts and results |
| Queue Control and Maintenance | Pause, drain, obliterate, clean and repair |
| Progress, Job Logs and Dependencies | Progress, per-job logs and dependencies |
| Queue Rate Limiting and Global Concurrency | Rate limits and global concurrency caps |
| DLQ Operations from the Queue Object | Failed-job operations from the Queue object |
| Workers, Stats and Metrics from the Queue | Registered workers, stats and metrics windows |
| Namespaces, Auto-Batching and Store-and-Forward | Namespaces, auto-batching, store-and-forward |
| JobOptions Reference | Every JobOptions field, with defaults |