1. class MessageQueueHandler {
  2. constructor(queueName, overrideStrategy = 'manual') {
  3. this.queueName = queueName;
  4. this.overrideStrategy = overrideStrategy;
  5. this.queue = new Map(); //Simulate message queue using Map
  6. }
  7. /**
  8. * Adds a message to the queue.
  9. * @param {any} message
  10. */
  11. addMessage(message) {
  12. this.queue.set(this.queueName, this.queue.get(this.queueName) || []);
  13. this.queue.get(this.queueName).push(message);
  14. //Simulate processing (delayed)
  15. setTimeout(() => {
  16. this.processQueue();
  17. }, 50); //Adjust delay as needed
  18. }
  19. /**
  20. * Processes messages from the queue.
  21. */
  22. processQueue() {
  23. if (!this.queue.has(this.queueName) || this.queue.get(this.queueName).length === 0) {
  24. return; // Queue is empty
  25. }
  26. const messages = this.queue.get(this.queueName);
  27. for (const message of messages) {
  28. try {
  29. this.handleMessage(message); //Attempt normal processing
  30. } catch (error) {
  31. if (this.overrideStrategy === 'manual') {
  32. this.manualOverride(message, error);
  33. } else {
  34. console.error("Unhandled error, skipping:", error);
  35. }
  36. }
  37. }
  38. this.queue.set(this.queueName, []); //Clear queue
  39. }
  40. /**
  41. * Handles a message. This is where your core message logic goes.
  42. * @param {any} message
  43. */
  44. handleMessage(message) {
  45. // Simulate processing - replace with your actual logic
  46. console.log(`Processing message: ${message}`);
  47. // Simulate a failure (for testing)
  48. if (Math.random() < 0.2) {
  49. throw new Error(`Simulated processing error for message: ${message}`);
  50. }
  51. console.log(`Finished processing message: ${message}`);
  52. }
  53. /**
  54. * Performs a manual override for a failed message.
  55. * @param {any} message
  56. * @param {Error} error
  57. */
  58. manualOverride(message, error) {
  59. console.warn(`Manual override triggered for message: ${message} due to error: ${error.message}`);
  60. //Implement your manual override logic here.
  61. //This might involve re-processing the message,
  62. //logging detailed information, or taking other corrective actions.
  63. console.log("Performing manual override...");
  64. //Example: Re-add the message to the queue for later processing
  65. this.addMessage(message);
  66. }
  67. /**
  68. * Gets the size of the queue.
  69. * @returns {number}
  70. */
  71. getQueueSize() {
  72. if(this.queue.has(this.queueName)){
  73. return this.queue.get(this.queueName).length;
  74. }
  75. return 0;
  76. }
  77. }
  78. // Example usage:
  79. const queueHandler = new MessageQueueHandler('myQueue', 'manual');
  80. queueHandler.addMessage('message1');
  81. queueHandler.addMessage('message2');
  82. queueHandler.addMessage('message3');
  83. // Simulate some time passing...
  84. setTimeout(() => {
  85. console.log("Queue size:", queueHandler.getQueueSize());
  86. }, 1000);

Add your comment