Search code examples
nestjsbullnestjsbull

How do you register multiple queues in Bull Board with NestJS


Does anyone know how to register multiple queues with Bullboard Module and NestJS. Every documentation I have found show an example of how to register a single queue as seen below:

Bullboard Docs: https://github.com/felixmosh/bull-board/tree/master/packages/nestjs

@Module({
  imports: [
    BullModule.registerQueue(
      {
        name: 'my_awesome_queue'
      }
    ),
    
    BullBoardModule.forFeature({
      name: 'my_awesome_queue',
      adapter: BullMQAdapter, //or use BullAdapter if you're using bull instead of bullMQ
    }),
  ],
})
export class FeatureModule {}

However what are you supposed to do when you have a module with multiple queues which seems like a common use case as seen below?

BullModule.registerQueue(
  {
    name: "download-youtube-queue",
  },
  {
    name: "upload-media-queue",
  },
  {
    name: "transcribe-queue",
  },
),

Seems like there should be a simple way to handle this.


Solution

  • According BullBoard module code, you can provide several BullBoardQueueOptions to forFeature method:

    export declare class BullBoardModule {
        static forFeature(...queues: BullBoardQueueOptions[]): DynamicModule;
        static forRoot(options: BullBoardModuleOptions): DynamicModule;
    }
    
    export type BullBoardQueueOptions = {
        name: string;
        adapter: {
            new (queue: any, options?: Partial<QueueAdapterOptions>): BaseAdapter;
        };
        options?: Partial<QueueAdapterOptions>;
    }
    

    So you can register multiple queues in Bull Board like this:

    @Module({
      imports: [
        BullModule.registerQueue(
          {
            name: 'my_awesome_queue'
          },
          {
            name: 'another_awesome_queue'
          }
        ),
        
        BullBoardModule.forFeature(
          {
            name: 'my_awesome_queue',
            adapter: BullMQAdapter, //or use BullAdapter if you're using bull instead of bullMQ
          },
          {
            name: 'another_awesome_queue',
            adapter: BullMQAdapter, //or use BullAdapter if you're using bull instead of bullMQ
          }
        ),
      ],
    })
    export class FeatureModule {}
    

    Or you can register several queues in separate modules:

    //awesome.module.ts
    @Module({
      imports: [
        BullModule.registerQueue(
          {
            name: 'my_awesome_queue'
          }
        ),
        
        BullBoardModule.forFeature({
          name: 'my_awesome_queue',
          adapter: BullMQAdapter, //or use BullAdapter if you're using bull instead of bullMQ
        }),
      ],
    })
    export class AwesomeModule {}
    
    //anotherAwesome.module.ts
    @Module({
      imports: [
        BullModule.registerQueue(
          {
            name: 'another_awesome_queue'
          }
        ),
        
        BullBoardModule.forFeature({
          name: 'another_awesome_queue',
          adapter: BullMQAdapter, //or use BullAdapter if you're using bull instead of bullMQ
        }),
      ],
    })
    export class AnotherAwesomeModule {}