rabbitmq-enterprise-toolkit
Version:
🚀 Enterprise-grade RabbitMQ wrapper for Node.js & TypeScript - High-throughput messaging with automatic retry, DLQ, batch processing & graceful shutdown. Production-ready AMQP client with zero message loss guarantee.
72 lines • 3.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RetryHandler = void 0;
const helpers_1 = require("../utils/helpers");
class RetryHandler {
constructor(getChannel) {
this.getChannel = getChannel;
}
async handleRetry(msg, options, error) {
const headers = msg.properties.headers || {};
const retryCount = headers.retryCount || 0;
const retryOptions = options.retryOptions;
if (retryOptions && retryCount < retryOptions.maxRetries) {
await this.retryMessage(msg, options, retryCount + 1, error);
}
else {
await this.sendToDeadLetterQueue(msg, retryCount, error);
}
}
async retryMessage(msg, options, newRetryCount, error) {
const channel = this.getChannel();
const delay = (0, helpers_1.calculateDelay)(newRetryCount - 1, options.retryOptions);
const retryQueueName = (0, helpers_1.createRetryQueueName)(options.queueName, newRetryCount);
try {
await this.createRetryQueue(channel, retryQueueName, delay, options.queueName);
const updatedHeaders = this.buildRetryHeaders(msg, newRetryCount, options.queueName, error);
await this.publishToRetryQueue(channel, retryQueueName, msg, updatedHeaders);
channel.ack(msg);
console.log(`Message retried: ${newRetryCount}/${options.retryOptions.maxRetries}, delay: ${delay}ms`);
}
catch (retryError) {
console.error('Retry operation failed:', retryError);
channel.nack(msg, false, false); // Send to DLQ
}
}
async createRetryQueue(channel, retryQueueName, delay, originalQueueName) {
await channel.assertQueue(retryQueueName, {
durable: true,
arguments: {
'x-message-ttl': delay,
'x-dead-letter-exchange': '',
'x-dead-letter-routing-key': (0, helpers_1.normalizeQueueName)(originalQueueName)
}
});
}
buildRetryHeaders(msg, newRetryCount, originalQueueName, error) {
return {
...msg.properties.headers,
retryCount: newRetryCount,
originalQueue: originalQueueName,
errorMessage: (0, helpers_1.formatError)(error),
firstFailedAt: msg.properties.headers?.firstFailedAt || Date.now()
};
}
async publishToRetryQueue(channel, retryQueueName, msg, headers) {
channel.publish('', retryQueueName, msg.content, {
...msg.properties,
headers
});
}
async sendToDeadLetterQueue(msg, retryCount, error) {
const channel = this.getChannel();
console.error(`Message retry exhausted, sending to DLQ:`, {
messageId: msg.properties.messageId,
retryCount,
error: (0, helpers_1.formatError)(error)
});
channel.nack(msg, false, false); // Send to DLQ
}
}
exports.RetryHandler = RetryHandler;
//# sourceMappingURL=retry-handler.js.map