class MessageQueueHandler {
constructor(queueName, overrideStrategy = 'manual') {
this.queueName = queueName;
this.overrideStrategy = overrideStrategy;
this.queue = new Map(); //Simulate message queue using Map
}
/**
* Adds a message to the queue.
* @param {any} message
*/
addMessage(message) {
this.queue.set(this.queueName, this.queue.get(this.queueName) || []);
this.queue.get(this.queueName).push(message);
//Simulate processing (delayed)
setTimeout(() => {
this.processQueue();
}, 50); //Adjust delay as needed
}
/**
* Processes messages from the queue.
*/
processQueue() {
if (!this.queue.has(this.queueName) || this.queue.get(this.queueName).length === 0) {
return; // Queue is empty
}
const messages = this.queue.get(this.queueName);
for (const message of messages) {
try {
this.handleMessage(message); //Attempt normal processing
} catch (error) {
if (this.overrideStrategy === 'manual') {
this.manualOverride(message, error);
} else {
console.error("Unhandled error, skipping:", error);
}
}
}
this.queue.set(this.queueName, []); //Clear queue
}
/**
* Handles a message. This is where your core message logic goes.
* @param {any} message
*/
handleMessage(message) {
// Simulate processing - replace with your actual logic
console.log(`Processing message: ${message}`);
// Simulate a failure (for testing)
if (Math.random() < 0.2) {
throw new Error(`Simulated processing error for message: ${message}`);
}
console.log(`Finished processing message: ${message}`);
}
/**
* Performs a manual override for a failed message.
* @param {any} message
* @param {Error} error
*/
manualOverride(message, error) {
console.warn(`Manual override triggered for message: ${message} due to error: ${error.message}`);
//Implement your manual override logic here.
//This might involve re-processing the message,
//logging detailed information, or taking other corrective actions.
console.log("Performing manual override...");
//Example: Re-add the message to the queue for later processing
this.addMessage(message);
}
/**
* Gets the size of the queue.
* @returns {number}
*/
getQueueSize() {
if(this.queue.has(this.queueName)){
return this.queue.get(this.queueName).length;
}
return 0;
}
}
// Example usage:
const queueHandler = new MessageQueueHandler('myQueue', 'manual');
queueHandler.addMessage('message1');
queueHandler.addMessage('message2');
queueHandler.addMessage('message3');
// Simulate some time passing...
setTimeout(() => {
console.log("Queue size:", queueHandler.getQueueSize());
}, 1000);
Add your comment