📖 Scenario: You are building a simple task processing system using NestJS. Tasks are added to a queue, and a consumer (processor) picks up tasks to process them one by one.This is like a restaurant kitchen where orders (tasks) come in, and a chef (consumer) prepares each order in turn.
🎯 Goal: Create a NestJS queue consumer (processor) that listens to a queue named task_queue and processes incoming tasks by logging their content.
📋 What You'll Learn
Create a queue named task_queue in the consumer service
Configure a consumer (processor) method to handle jobs from task_queue
Log the job data inside the processor method
Use NestJS Bull module patterns for queue and processor setup
💡 Why This Matters
🌍 Real World
Queue consumers are used in real applications to process background tasks like sending emails, resizing images, or processing payments without blocking the main app.
💼 Career
Understanding queue consumers is important for backend developers working with microservices, distributed systems, or any app needing reliable background task processing.
Progress0 / 4 steps
1
Set up the queue consumer service
Create a NestJS service class called TaskConsumerService and import Processor and Process decorators from @nestjs/bull. Use the @Processor('task_queue') decorator on the class.
NestJS
Hint
Use @Processor('task_queue') above the class to link it to the queue.
2
Add a processor method to handle jobs
Inside TaskConsumerService, add a method called handleTask decorated with @Process() to process jobs from the queue. The method should accept a single parameter job of type any.
NestJS
Hint
The @Process() decorator marks the method as a job processor.
3
Log the job data inside the processor method
Inside the handleTask method, add a line to log the job's data property using console.log(job.data).
NestJS
Hint
Use console.log(job.data) to see the task details when processed.
4
Export the consumer service for use in the module
Add export keyword before the TaskConsumerService class declaration to make it available for import in other parts of the application.
NestJS
Hint
The class must be exported so NestJS can use it as a provider.
Practice
(1/5)
1. What is the main purpose of a queue consumer (processor) in a NestJS application?
easy
A. To send HTTP requests to external APIs
B. To render UI components on the client side
C. To listen to a queue and process jobs asynchronously in the background
D. To manage database migrations synchronously
Solution
Step 1: Understand the role of queue consumers
Queue consumers listen to queues and handle jobs asynchronously, allowing background processing.
Step 2: Compare with other options
Sending HTTP requests, rendering UI, and managing migrations are unrelated to queue consumers.
Final Answer:
To listen to a queue and process jobs asynchronously in the background -> Option C
Quick Check:
Queue consumer = background job handler [OK]
Hint: Queue consumers handle background jobs, not UI or HTTP [OK]
Common Mistakes:
Confusing queue consumers with HTTP controllers
Thinking queue consumers run synchronously
Assuming queue consumers manage UI rendering
2. Which decorator is used to mark a class as a queue consumer (processor) in NestJS?
easy
A. @Processor
B. @Queue
C. @Process
D. @Consumer
Solution
Step 1: Identify the decorator for queue consumers
The @Processor decorator marks a class as a queue consumer in NestJS.
Step 2: Differentiate from other decorators
@Process marks methods, @Queue and @Consumer are not valid NestJS decorators for this purpose.
Final Answer:
@Processor -> Option A
Quick Check:
Class decorator for consumers = @Processor [OK]
Hint: Class decorator for consumers is @Processor, method decorator is @Process [OK]
Common Mistakes:
Using @Process on the class instead of methods
Confusing @Processor with @Queue
Assuming @Consumer is a valid decorator
3. Given the following NestJS queue consumer code, what will be logged when a job with data { name: 'Alice' } is processed?
import { Processor, Process } from '@nestjs/bull';
import { Job } from 'bull';
@Processor('email')
export class EmailProcessor {
@Process('send')
async handleSend(job: Job) {
console.log(`Sending email to ${job.data.name}`);
}
}
medium
A. No output because handleSend is not called
B. Sending email to Alice
C. Error: job.data is not defined
D. Sending email to undefined
Solution
Step 1: Understand job data usage
The job object contains data with a name property 'Alice'. The method logs this value.
Step 2: Confirm method is called on 'send' jobs
The @Process('send') decorator ensures handleSend runs for jobs named 'send' in the 'email' queue.
Final Answer:
Sending email to Alice -> Option B
Quick Check:
job.data.name = 'Alice' logged correctly [OK]
Hint: Job data is accessed via job.data inside @Process methods [OK]
Common Mistakes:
Assuming job.data is undefined
Thinking method won't run without explicit call
Confusing queue name with job name
4. Identify the error in this NestJS queue consumer code snippet:
import { Processor, Process } from '@nestjs/bull';
import { Job } from 'bull';
@Processor('notifications')
export class NotificationProcessor {
@Process()
async handleNotification(job: Job) {
console.log('Notification:', job.data.message);
}
}
medium
A. Job parameter type should be any, not Job
B. The class should not have @Processor decorator
C. Console.log syntax is incorrect
D. @Process decorator is missing the job name argument
Solution
Step 1: Check @Process decorator usage
@Process requires a job name string to specify which jobs to handle; it's missing here.
Step 2: Validate other parts
@Processor on class is correct, Job type is valid, console.log syntax is correct.
Final Answer:
@Process decorator is missing the job name argument -> Option D
Quick Check:
@Process needs job name argument [OK]
Hint: @Process must specify job name string inside parentheses [OK]
Common Mistakes:
Omitting job name in @Process decorator
Removing @Processor from class
Changing Job type unnecessarily
5. You want to create a NestJS queue consumer that processes two different job types: 'email' and 'sms' in the same queue 'notifications'. Which is the correct way to define the processor class and methods?
hard
A. Use @Processor('notifications') on class, and two methods with @Process('email') and @Process('sms') decorators
B. Use two separate classes each with @Processor('notifications') and one @Process method
C. Use @Processor('email') and @Processor('sms') on the same class with one @Process method
D. Use @Process('notifications') on methods without @Processor on class
Solution
Step 1: Understand queue and job type separation
The queue is 'notifications'. The job types are 'email' and 'sms'. One class can handle multiple job types with separate @Process decorators.
Step 2: Validate correct decorator usage
@Processor('notifications') marks the queue. Methods use @Process('email') and @Process('sms') to handle each job type.
Final Answer:
Use @Processor('notifications') on class, and two methods with @Process('email') and @Process('sms') decorators -> Option A
Quick Check:
One class, multiple @Process methods for job types [OK]
Hint: One @Processor class can have many @Process methods for different jobs [OK]
Common Mistakes:
Creating multiple classes for same queue unnecessarily
Using multiple @Processor decorators on one class
Omitting @Processor on class and only using @Process
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.