A lightweight job queue system using MongoDB and Mongoose. Useful for handling background processing like sending notifications, emails, etc., without needing Redis or RabbitMQ.
- 🆕 Create named queues dynamically backed by MongoDB
- 🧠 Register custom consumers (job processors) for each queue
- 🚀 Start job processing on-demand per queue
- 📬 Add (enqueue) jobs with flexible options like delays or priorities
- 📡 Check and fetch queues by name with metadata
- ✅ Track job status using unique job IDs
- 📊 Count jobs in a queue using filters (e.g., by status)
- 📦 Retrieve all jobs from a specific queue
- 🧹 Clear individual queues or purge all queues
- 🗂 List all queues along with their jobs
- ❌ Remove specific queues and their jobs permanently
- ⛔ Deactivate queues to pause processing
- 🔁 Activate queues to resume processing
- ⚙️ MongoDB-powered: persistent, scalable, and fault-tolerant
- 🔌 Lightweight & plug-and-play with minimal setup
npm install mongoose uuid
Make sure MongoDB is running on your system:
mongod
npm install soft-queue
const Queue = require("./Queue");
const { init } = require("./db/dbConfig");
const main = async () => {
await init({
uri: 'mongodb://localhost:27017/soft-jobQueueDB',
options: {
useNewUrlParser: true,
useUnifiedTopology: true,
}
});
// Create a new queue
const queue = await Queue.createQueue('notifications');
console.log({ queue });
// Register a consumer for the 'notifications' queue
Queue.registerConsumer('notifications', async (job) => {
console.log(`🔔 Sending notification: ${job.message}`);
await new Promise(resolve => setTimeout(resolve, 500)); // simulate delay
console.log(`✅ Notification sent: ${job.message}`);
});
// Add jobs to the queue
await Queue.enqueue('notifications', { message: 'Welcome to our service!' });
await Queue.enqueue('notifications', { message: 'Your account has been created.' });
await Queue.enqueue('notifications', { message: 'Your password has been changed.' });
// Count pending jobs
const count = await Queue.getJobCount('notifications');
console.log({ count });
// Start processing jobs in the queue
Queue.startProcessing('notifications');
};
main();
Create a new queue.
Registers a function to handle jobs in a queue.
Adds a new job to a queue.
Begins processing the queue using the registered consumer.
Get status of a specific job.
Count jobs in a queue with optional filters.
Retrieve all jobs in a queue.
Delete all jobs in a specific queue.
Remove all queues and their jobs.
Get all queues with their jobs.
Permanently delete a queue.
Pause job processing for a queue.
Resume job processing for a queue
{ queue: { queueId: ..., queueName: 'notifications', ... } }
🔔 Sending notification: Welcome to our service!
✅ Notification sent: Welcome to our service!
🔔 Sending notification: Your account has been created.
✅ Notification sent: Your account has been created.
🔔 Sending notification: Your password has been changed.
✅ Notification sent: Your password has been changed.
{ count: 3 }