redis-smq
Version:
A simple high-performance Redis message queue for Node.js.
75 lines • 4.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const redis_smq_common_1 = require("redis-smq-common");
const _get_queue_consumer_ids_js_1 = require("../../queue/_/_get-queue-consumer-ids.js");
const consumer_heartbeat_js_1 = require("../consumer-heartbeat/consumer-heartbeat.js");
const message_unacknowledgement_js_1 = require("../message-handler/message-handler/consume-message/message-unacknowledgement.js");
const index_js_1 = require("../types/index.js");
const worker_js_1 = require("./worker.js");
class WatchConsumersWorker extends worker_js_1.Worker {
constructor(args) {
super(args);
this.work = (cb) => {
this.logger.debug('Starting watch consumers work cycle');
const redisClient = this.redisClient.getInstance();
if (redisClient instanceof Error) {
this.logger.error('Failed to get Redis client instance', redisClient);
cb(redisClient);
return void 0;
}
const queueName = this.queueParsedParams.queueParams.name;
const queueNamespace = this.queueParsedParams.queueParams.ns;
this.logger.debug(`Checking consumers for queue: ${queueNamespace}:${queueName}`);
(0, _get_queue_consumer_ids_js_1._getQueueConsumerIds)(redisClient, this.queueParsedParams.queueParams, (err, consumerIds) => {
if (err) {
this.logger.error(`Error retrieving consumer IDs for queue ${queueNamespace}:${queueName}`, err);
cb(err);
}
else {
const consumerCount = (consumerIds === null || consumerIds === void 0 ? void 0 : consumerIds.length) || 0;
this.logger.debug(`Found ${consumerCount} consumers for queue ${queueNamespace}:${queueName}`);
redis_smq_common_1.async.eachOf(consumerIds !== null && consumerIds !== void 0 ? consumerIds : [], (consumerId, index, done) => {
this.logger.debug(`Checking heartbeat for consumer ${consumerId} (${index + 1}/${consumerCount})`);
consumer_heartbeat_js_1.ConsumerHeartbeat.isConsumerAlive(redisClient, consumerId, (err, alive) => {
if (err) {
this.logger.error(`Error checking heartbeat for consumer ${consumerId}`, err);
done(err);
}
else if (!alive) {
this.logger.info(`Consumer ${consumerId} is offline, unacknowledging messages`);
this.messageUnacknowledgement.unacknowledgeMessagesInProcess(consumerId, [this.queueParsedParams.queueParams], index_js_1.EMessageUnacknowledgementReason.OFFLINE_CONSUMER, (err, status) => {
if (err) {
this.logger.error(`Failed to unacknowledge messages for offline consumer ${consumerId}`, err);
done(err);
}
else {
const messageCount = status
? Object.keys(status).length
: 0;
this.logger.info(`Successfully unacknowledged ${messageCount} messages for offline consumer ${consumerId}`);
done();
}
});
}
else {
this.logger.debug(`Consumer ${consumerId} is alive and active`);
done();
}
});
}, (err) => {
if (err) {
this.logger.error('Error during consumer heartbeat check cycle', err);
}
else {
this.logger.debug('Completed watch consumers work cycle successfully');
}
cb(err);
});
}
});
};
this.messageUnacknowledgement = new message_unacknowledgement_js_1.MessageUnacknowledgement(this.redisClient);
}
}
exports.default = (payload) => new WatchConsumersWorker(payload);
//# sourceMappingURL=watch-consumers.worker.js.map