Control worker job processing by pausing and resuming workers or queues
BullMQ allows you to pause job processing at two levels: globally (entire queue) or locally (specific worker). Paused workers continue processing active jobs but don’t fetch new ones.
Pause the entire queue so no workers pick up jobs:
import { Queue } from 'bullmq';const queue = new Queue('queueName', { connection: { host: 'localhost', port: 6379, },});// Pause the queue globallyawait queue.pause();console.log('Queue paused - no workers will process jobs');// Resume the queueawait queue.resume();console.log('Queue resumed - workers can process jobs again');
Maintenance windows: Pause processing during system upgrades
Emergency stop: Halt all processing due to critical issues
Rate limiting: Temporarily stop processing to avoid overwhelming downstream systems
Deployment: Pause before deploying new worker code
import { Queue } from 'bullmq';const queue = new Queue('queueName');// Pause before maintenanceawait queue.pause();console.log('Queue paused for maintenance');// Perform maintenanceawait performDatabaseMigration();// Resume after maintenanceawait queue.resume();console.log('Queue resumed after maintenance');
// Pause immediately, don't wait for active jobsawait worker.pause(true);console.log('Worker paused immediately');// Active jobs continue running but worker is marked as paused
Passing true to pause() makes the worker stop fetching new jobs immediately, but active jobs continue processing.
import { Worker } from 'bullmq';const worker = new Worker('queueName', processorFunction);// Check pause stateif (worker.isPaused()) { console.log('Worker is paused');} else { console.log('Worker is active');}// Check if worker is runningif (worker.isRunning()) { console.log('Worker is running');}
Workers can pause themselves during job processing:
import { Worker } from 'bullmq';const worker = new Worker('queueName', async (job) => { const result = await processJob(job.data); // Check result and pause worker if needed if (result.shouldPause) { console.log('Pausing worker due to job result'); await worker.pause(); } return result;});
Be careful when pausing a worker from within a job processor. The pause will take effect after the current job completes.
import { Worker } from 'bullmq';const worker = new Worker('queueName', processorFunction);worker.on('drained', async () => { console.log('Queue drained (no more jobs)'); // Optionally pause when no jobs are available await worker.pause(); // Resume after some time or based on external trigger setTimeout(() => { console.log('Resuming worker to check for new jobs'); worker.resume(); }, 60000); // Resume after 1 minute});