@@ -123,12 +123,10 @@ Organize related jobs together for monitoring and filtering:
123123
124124``` typescript
125125// Group newsletter jobs
126- await SendEmailJob .
dispatch ({ to:
' [email protected] ' })
127- .group (' newsletter-jan-2025' )
126+ await SendEmailJob .
dispatch ({ to:
' [email protected] ' }).
group (
' newsletter-jan-2025' )
128127
129128// Group with bulk dispatch
130- await SendEmailJob .dispatchMany (recipients )
131- .group (' newsletter-jan-2025' )
129+ await SendEmailJob .dispatchMany (recipients ).group (' newsletter-jan-2025' )
132130```
133131
134132The ` groupId ` is stored with job data and accessible via ` job.data.groupId ` .
@@ -153,7 +151,7 @@ export default class ImportantJob extends Job<Payload> {
153151<summary ><strong >Retention options</strong ></summary >
154152
155153| Value | Behavior |
156- | ----------------------------- | -------------------- |
154+ | --------------------------- | ------------------ |
157155| ` true ` (default) | Remove immediately |
158156| ` false ` | Keep forever |
159157| ` { count: n } ` | Keep last n jobs |
@@ -164,9 +162,9 @@ Query job history:
164162
165163``` typescript
166164const job = await adapter .getJob (' job-id' , ' queue-name' )
167- console .log (job .status ) // 'completed' | 'failed'
168- console .log (job .finishedAt ) // timestamp
169- console .log (job .error ) // error message (if failed)
165+ console .log (job .status ) // 'completed' | 'failed'
166+ console .log (job .finishedAt ) // timestamp
167+ console .log (job .error ) // error message (if failed)
170168```
171169
172170</details >
@@ -256,24 +254,24 @@ const adapter = sync() // Jobs execute immediately
256254``` typescript
257255export default class MyJob extends Job <Payload > {
258256 static options: JobOptions = {
259- queue: ' email' , // Queue name (default: 'default')
260- priority: 1 , // Lower = higher priority (default: 5)
261- maxRetries: 3 , // Retry attempts before failing
262- timeout: ' 30s' , // Max execution time
263- failOnTimeout: true , // Fail permanently on timeout (default: retry)
264- removeOnComplete: { count: 100 }, // Keep last 100 completed
265- removeOnFail: { age: ' 7d' }, // Keep failed for 7 days
257+ queue: ' email' , // Queue name (default: 'default')
258+ priority: 1 , // Lower = higher priority (default: 5)
259+ maxRetries: 3 , // Retry attempts before failing
260+ timeout: ' 30s' , // Max execution time
261+ failOnTimeout: true , // Fail permanently on timeout (default: retry)
262+ removeOnComplete: { count: 100 }, // Keep last 100 completed
263+ removeOnFail: { age: ' 7d' }, // Keep failed for 7 days
266264 }
267265}
268266```
269267
270268## Delayed Jobs
271269
272270``` typescript
273- await SendEmailJob .dispatch (payload ).in (' 30s' ) // 30 seconds
274- await SendEmailJob .dispatch (payload ).in (' 5m' ) // 5 minutes
275- await SendEmailJob .dispatch (payload ).in (' 2h' ) // 2 hours
276- await SendEmailJob .dispatch (payload ).in (' 1d' ) // 1 day
271+ await SendEmailJob .dispatch (payload ).in (' 30s' ) // 30 seconds
272+ await SendEmailJob .dispatch (payload ).in (' 5m' ) // 5 minutes
273+ await SendEmailJob .dispatch (payload ).in (' 2h' ) // 2 hours
274+ await SendEmailJob .dispatch (payload ).in (' 1d' ) // 1 day
277275```
278276
279277## Retry & Backoff
@@ -285,12 +283,13 @@ export default class ReliableJob extends Job<Payload> {
285283 static options: JobOptions = {
286284 maxRetries: 5 ,
287285 retry: {
288- backoff : () => exponentialBackoff ({
289- baseDelay: ' 1s' ,
290- maxDelay: ' 1m' ,
291- multiplier: 2 ,
292- jitter: true ,
293- }),
286+ backoff : () =>
287+ exponentialBackoff ({
288+ baseDelay: ' 1s' ,
289+ maxDelay: ' 1m' ,
290+ multiplier: 2 ,
291+ jitter: true ,
292+ }),
294293 },
295294 }
296295}
@@ -356,13 +355,12 @@ Run jobs on a recurring basis:
356355
357356``` typescript
358357// Every 10 seconds
359- await MetricsJob .schedule ({ endpoint: ' /health' })
360- .every (' 10s' )
358+ await MetricsJob .schedule ({ endpoint: ' /health' }).every (' 10s' )
361359
362360// Cron schedule
363361await CleanupJob .schedule ({ days: 30 })
364362 .id (' daily-cleanup' )
365- .cron (' 0 0 * * *' ) // Midnight daily
363+ .cron (' 0 0 * * *' ) // Midnight daily
366364 .timezone (' Europe/Paris' )
367365```
368366
@@ -376,7 +374,7 @@ import { Schedule } from '@boringnode/queue'
376374const schedule = await Schedule .find (' daily-cleanup' )
377375await schedule .pause ()
378376await schedule .resume ()
379- await schedule .trigger () // Run now
377+ await schedule .trigger () // Run now
380378await schedule .delete ()
381379
382380// List schedules
@@ -387,7 +385,7 @@ const active = await Schedule.list({ status: 'active' })
387385** Schedule options:**
388386
389387| Method | Description |
390- | --------------------- | ----------------------------------- |
388+ | ------------------- | --------------------------------- |
391389| ` .id(string) ` | Unique identifier |
392390| ` .every(duration) ` | Fixed interval ('5s', '1m', '1h') |
393391| ` .cron(expression) ` | Cron schedule |
@@ -437,13 +435,13 @@ export default class SendEmailJob extends Job<SendEmailPayload> {
437435``` typescript
438436const config = {
439437 worker: {
440- concurrency: 5 , // Parallel jobs
441- idleDelay: ' 2s' , // Poll interval when idle
442- timeout: ' 1m' , // Default job timeout
438+ concurrency: 5 , // Parallel jobs
439+ idleDelay: ' 2s' , // Poll interval when idle
440+ timeout: ' 1m' , // Default job timeout
443441 stalledThreshold: ' 30s' , // When to consider job stalled
444- stalledInterval: ' 30s' , // How often to check
445- maxStalledCount: 1 , // Max recoveries before failing
446- gracefulShutdown: true , // Wait for jobs on SIGTERM
442+ stalledInterval: ' 30s' , // How often to check
443+ maxStalledCount: 1 , // Max recoveries before failing
444+ gracefulShutdown: true , // Wait for jobs on SIGTERM
447445 },
448446}
449447```
@@ -464,7 +462,7 @@ await QueueManager.init({
464462Performance comparison with BullMQ (5ms simulated work per job):
465463
466464| Jobs | Concurrency | @boringnode/queue | BullMQ | Diff |
467- | ------ | ------------- | ------------------- | -------- | ------------- |
465+ | ---- | ----------- | ----------------- | ------ | ----------- |
468466| 1000 | 5 | 1096ms | 1116ms | 1.8% faster |
469467| 1000 | 10 | 565ms | 579ms | 2.4% faster |
470468| 100K | 10 | 56.2s | 57.5s | 2.1% faster |
0 commit comments