Skip to content

Commit

Permalink
feat(job-queue-plugin): Allow config of retries/backoff for BullMQ
Browse files Browse the repository at this point in the history
Relates to #1111
  • Loading branch information
michaelbromley committed Oct 5, 2021
1 parent d856495 commit 9fda858
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,14 @@ export class BullMQJobQueueStrategy implements InspectableJobQueueStrategy {
}

async add<Data extends JobData<Data> = {}>(job: Job<Data>): Promise<Job<Data>> {
const retries = this.options.setRetries?.(job.queueName, job) ?? job.retries;
const backoff = this.options.setBackoff?.(job.queueName, job) ?? {
delay: 1000,
type: 'exponential',
};
const bullJob = await this.queue.add(job.queueName, job.data, {
attempts: job.retries + 1,
backoff: {
delay: 1000,
type: 'exponential',
},
attempts: retries + 1,
backoff,
});
return this.createVendureJob(bullJob);
}
Expand Down
47 changes: 47 additions & 0 deletions packages/job-queue-plugin/src/bullmq/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Job } from '@vendure/core';
import { ConnectionOptions, QueueSchedulerOptions, WorkerOptions } from 'bullmq';
import { QueueOptions } from 'bullmq';

Expand All @@ -7,6 +8,8 @@ import { QueueOptions } from 'bullmq';
*
* @since 1.2.0
* @docsCategory job-queue-plugin
* @docsPage BullMQPluginOptions
* @docsWeight 0
*/
export interface BullMQPluginOptions {
/**
Expand Down Expand Up @@ -38,4 +41,48 @@ export interface BullMQPluginOptions {
* See the [BullMQ QueueSchedulerOptions docs](https://github.com/taskforcesh/bullmq/blob/master/docs/gitbook/api/bullmq.queuescheduleroptions.md)
*/
schedulerOptions?: Exclude<QueueSchedulerOptions, 'connection'>;
/**
* @description
* When a job is added to the JobQueue using `JobQueue.add()`, the calling
* code may specify the number of retries in case of failure. This option allows
* you to override that number and specify your own number of retries based on
* the job being added.
*
* @since 1.3.0
*/
setRetries?: (queueName: string, job: Job) => number;
/**
* @description
* This allows you to specify the backoff settings when a failed job gets retried.
* In other words, this determines how much time should pass before attempting to
* process the failed job again. If the function returns `undefined`, the default
* value of exponential/1000ms will be used.
*
* @example
* ```TypeScript
* setBackoff: (queueName, job) => {
* return {
* type: 'exponential', // or 'fixed'
* delay: 10000 // first retry after 10s, second retry after 20s, 40s,...
* };
* }
* ```
* @since 1.3.0
* @default 'exponential', 1000
*/
setBackoff?: (queueName: string, job: Job) => BackoffOptions | undefined;
}

/**
* @description
* Configuration for the backoff function when retrying failed jobs.
*
* @since 1.3.0
* @docsCategory job-queue-plugin
* @docsPage BullMQPluginOptions
* @docsWeight 1
*/
export interface BackoffOptions {
type: 'exponential' | 'fixed';
delay: number;
}

0 comments on commit 9fda858

Please sign in to comment.