NestJS

Jobs (Queues)

Background jobs and message queues using Bull in NestJS.

App Module Configuration: Registering the Bull module in the main application module.
📄app.module.ts
typescript
import { Module } from '@nestjs/common';
import { BullModule } from '@nestjs/bull';
import { AudioModule } from './audio/audio.module';

@Module({
  imports: [
    BullModule.forRoot({
      redis: {
        host: 'localhost',
        port: 6379,
      },
    }),
    AudioModule,
  ],
})
export class AppModule {}
Queue Processor: Creating a consumer to process background jobs.
📄audio.processor.ts
typescript
import { Processor, Process } from '@nestjs/bull';
import { Job } from 'bull';

@Processor('audio')
export class AudioProcessor {
  @Process('transcode')
  async handleTranscode(job: Job) {
    console.log('Start transcoding...');
    console.log(job.data);
    
    // Simulate long-running job
    await new Promise((resolve) => setTimeout(resolve, 3000));
    
    console.log('Transcoding completed');
  }
}
Adding Jobs: Injecting the queue and adding jobs to it from a service or controller.
📄audio.service.ts
typescript
import { Injectable } from '@nestjs/common';
import { InjectQueue } from '@nestjs/bull';
import { Queue } from 'bull';

@Injectable()
export class AudioService {
  constructor(@InjectQueue('audio') private audioQueue: Queue) {}

  async transcode(file: any) {
    const job = await this.audioQueue.add('transcode', {
      file: 'audio.mp3',
      format: 'wav',
    });
    
    return { jobId: job.id, status: 'Processing started' };
  }
}