📖 Scenario: You are building a simple task queue system in a NestJS application. You want to track when tasks are added to the queue and when they are completed. This helps you monitor the queue's activity and ensure tasks are processed correctly.
🎯 Goal: Create a NestJS service that manages a queue of tasks. You will add tasks to the queue, track events when tasks are added and completed, and print monitoring messages to the console.
📋 What You'll Learn
Create a queue array to hold task names
Add a configuration variable to count completed tasks
Implement functions to add tasks and mark them as completed with event logs
Print the current queue and completed task count
💡 Why This Matters
🌍 Real World
Monitoring queue events helps teams track task progress and system health in real-time, which is critical for reliable applications.
💼 Career
Understanding queue event handling and monitoring is essential for backend developers and DevOps engineers working with task processing systems.
Progress0 / 4 steps
1
Create the initial queue array
Create a variable called taskQueue and set it to an empty array to hold task names.
NestJS
Hint
Use const taskQueue: string[] = []; to create an empty array for tasks.
2
Add a completed task counter
Create a variable called completedCount and set it to 0 to count completed tasks.
NestJS
Hint
Use let completedCount = 0; to track how many tasks are done.
3
Implement add and complete task functions with event logs
Write a function called addTask that takes a taskName string, adds it to taskQueue, and logs "Task added: ". Write another function called completeTask that removes the first task from taskQueue, increments completedCount, and logs "Task completed: ".
NestJS
Hint
Use taskQueue.push(taskName) to add and taskQueue.shift() to remove the first task. Use console.log to print messages.
4
Print the queue and completed task count
Write two console.log statements: one to print "Current queue:" followed by the taskQueue array, and another to print "Completed tasks:" followed by the completedCount.
NestJS
Hint
Use console.log("Current queue:", taskQueue); and console.log("Completed tasks:", completedCount); to show the status.
Practice
(1/5)
1. What is the main purpose of using @OnQueueEvent decorators in NestJS queues?
easy
A. To delete jobs from the queue manually
B. To listen and react to specific queue events like job completion or failure
C. To configure the queue's concurrency settings
D. To create new queues dynamically at runtime
Solution
Step 1: Understand the role of @OnQueueEvent
This decorator is used to listen for events emitted by the queue, such as when a job completes or fails.
Step 2: Identify what @OnQueueEvent does not do
It does not create queues, configure concurrency, or delete jobs manually; it only listens to events.
Final Answer:
To listen and react to specific queue events like job completion or failure -> Option B
Quick Check:
@OnQueueEvent listens to events [OK]
Hint: Remember: @OnQueueEvent listens to queue events only [OK]
Common Mistakes:
Thinking it creates or deletes queues
Confusing event listening with queue configuration
Assuming it manages job concurrency
2. Which of the following is the correct syntax to listen for a 'completed' event in a NestJS queue using @OnQueueEvent?
easy
A. @OnQueueEvent('done')
handleDone(job: Job) {
// handle job completion
}
B. @OnQueueEvent('complete')
handleComplete(job: Job) {
// handle job completion
}
C. @OnQueueEvent('completed')
handleCompleted(job: Job) {
// handle job completion
}
D. @OnQueueEvent('finished')
handleFinished(job: Job) {
// handle job completion
}
Solution
Step 1: Recall the exact event name for job completion
The official event name emitted by NestJS queues for job completion is 'completed'.
Step 2: Match the syntax with the correct event name
The syntax must use @OnQueueEvent('completed') to listen properly.
Final Answer:
@OnQueueEvent('completed')\nhandleCompleted(job: Job) {\n // handle job completion\n} -> Option C
Quick Check:
Event name is 'completed' exactly [OK]
Hint: Use exact event names like 'completed' with @OnQueueEvent [OK]
Common Mistakes:
Using incorrect event names like 'complete' or 'done'
Misspelling the decorator syntax
Not passing the event name as a string
3. Given the following code snippet, what will be logged when a job fails in the queue?
B. You must call the handler manually after job completion
C. The method name must be 'onCompleted' instead of 'handleCompleted'
D. The handler is missing the job parameter to receive event data
Solution
Step 1: Check the event handler signature
Event handlers for 'completed' receive the job object as a parameter, but this method has none.
Step 2: Understand why missing parameters cause no trigger
Without the expected parameter, NestJS cannot properly call the handler, so it never triggers.
Final Answer:
The handler is missing the job parameter to receive event data -> Option D
Quick Check:
Event handlers need correct parameters [OK]
Hint: Always include expected parameters in event handlers [OK]
Common Mistakes:
Omitting parameters in event handlers
Changing event names incorrectly
Thinking handlers must be called manually
5. You want to monitor a NestJS queue to log when jobs are added, completed, or failed. Which combination of event listeners should you implement to cover these events effectively?
hard
A. Use @OnQueueEvent('waiting'), @OnQueueEvent('completed'), and @OnQueueEvent('failed')
B. Use @OnQueueEvent('added'), @OnQueueEvent('done'), and @OnQueueEvent('error')
C. Use @OnQueueEvent('start'), @OnQueueEvent('finish'), and @OnQueueEvent('fail')
D. Use @OnQueueEvent('enqueue'), @OnQueueEvent('success'), and @OnQueueEvent('failure')
Solution
Step 1: Identify correct event names for job lifecycle
In NestJS queues, 'waiting' is emitted when a job is added, 'completed' when done, and 'failed' on failure.
Step 2: Verify the other options' event names
Other options use incorrect or non-existent event names like 'added', 'done', 'error', 'start', 'finish', 'fail', 'enqueue', 'success', 'failure'.
Final Answer:
Use @OnQueueEvent('waiting'), @OnQueueEvent('completed'), and @OnQueueEvent('failed') -> Option A