UNPKG

redis-smq

Version:

A simple high-performance Redis message queue for Node.js.

141 lines 6.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Consumer = void 0; const events_1 = require("../../common/events/events"); const redis_keys_1 = require("../../common/redis-keys/redis-keys"); const consumer_heartbeat_1 = require("./consumer-heartbeat"); const base_1 = require("../base"); const consumer_queues_1 = require("./consumer-queues"); const message_handler_runner_1 = require("./consumer-message-handler/message-handler-runner"); const multiplexed_message_handler_runner_1 = require("./consumer-message-handler/multiplexed-message-handler/multiplexed-message-handler-runner"); const queue_1 = require("../queue-manager/queue"); const redis_smq_common_1 = require("redis-smq-common"); const delay_worker_1 = require("../../workers/delay.worker"); const watchdog_worker_1 = require("../../workers/watchdog.worker"); const requeue_worker_1 = require("../../workers/requeue.worker"); const schedule_worker_1 = require("../../workers/schedule.worker"); class Consumer extends base_1.Base { constructor(config = {}, useMultiplexing = false) { super(config); this.heartbeat = null; this.workerRunner = null; this.setUpHeartbeat = (cb) => { (0, redis_smq_common_1.createClientInstance)(this.config.redis, (err, redisClient) => { if (err) cb(err); else if (!redisClient) cb(new redis_smq_common_1.errors.EmptyCallbackReplyError()); else { this.heartbeat = new consumer_heartbeat_1.ConsumerHeartbeat(this, redisClient); this.heartbeat.on(events_1.events.ERROR, (err) => this.emit(events_1.events.ERROR, err)); this.heartbeat.once(events_1.events.TICK, () => cb()); } }); }; this.tearDownHeartbeat = (cb) => { if (this.heartbeat) { this.heartbeat.quit(() => { this.heartbeat = null; cb(); }); } else cb(); }; this.setUpConsumerWorkers = (cb) => { const redisClient = this.getSharedRedisClient(); const { keyLockConsumerWorkersRunner } = this.getRedisKeys(); const nsLogger = redis_smq_common_1.logger.getNamespacedLogger(this.config.logger, `consumer:${this.id}:worker-runner`); this.workerRunner = new redis_smq_common_1.WorkerRunner(redisClient, keyLockConsumerWorkersRunner, new redis_smq_common_1.WorkerPool(), nsLogger); this.workerRunner.on(events_1.events.ERROR, (err) => this.emit(events_1.events.ERROR, err)); this.workerRunner.once(events_1.events.UP, cb); this.workerRunner.addWorker(new delay_worker_1.default(redisClient, true)); this.workerRunner.addWorker(new watchdog_worker_1.default(redisClient, this.config, true, this.logger)); this.workerRunner.addWorker(new requeue_worker_1.default(redisClient, true)); this.workerRunner.addWorker(new schedule_worker_1.default(redisClient, true)); this.workerRunner.run(); }; this.initConsumerEventListeners = (cb) => { this.registerEventListeners(this.config.eventListeners.consumerEventListeners, cb); }; this.tearDownConsumerWorkers = (cb) => { if (this.workerRunner) { this.workerRunner.quit(() => { this.workerRunner = null; cb(); }); } else cb(); }; this.runMessageHandlers = (cb) => { const redisClient = this.getSharedRedisClient(); this.messageHandlerRunner.run(redisClient, cb); }; this.shutdownMessageHandlers = (cb) => { if (this.messageHandlerRunner) { this.messageHandlerRunner.shutdown(cb); } else cb(); }; const nsLogger = redis_smq_common_1.logger.getNamespacedLogger(this.config.logger, `consumer:${this.id}:message-handler`); this.messageHandlerRunner = useMultiplexing ? new multiplexed_message_handler_runner_1.MultiplexedMessageHandlerRunner(this, nsLogger) : new message_handler_runner_1.MessageHandlerRunner(this, nsLogger); this.redisKeys = redis_keys_1.redisKeys.getConsumerKeys(this.getId()); } goingUp() { return super .goingUp() .concat([ this.setUpHeartbeat, this.initConsumerEventListeners, this.runMessageHandlers, this.setUpConsumerWorkers, ]); } goingDown() { return [ this.tearDownConsumerWorkers, this.shutdownMessageHandlers, this.tearDownHeartbeat, ].concat(super.goingDown()); } consume(queue, messageHandler, cb) { const queueParams = queue_1.Queue.getParams(this.config, queue); this.messageHandlerRunner.addMessageHandler(queueParams, messageHandler, cb); } cancel(queue, cb) { const queueParams = queue_1.Queue.getParams(this.config, queue); this.messageHandlerRunner.removeMessageHandler(queueParams, cb); } getQueues() { return this.messageHandlerRunner.getQueues(); } getRedisKeys() { return this.redisKeys; } static getConsumersHeartbeats(redisClient, consumersIds, cb) { consumer_heartbeat_1.ConsumerHeartbeat.getConsumersHeartbeats(redisClient, consumersIds, cb); } static getConsumerHeartbeat(redisClient, consumerId, cb) { consumer_heartbeat_1.ConsumerHeartbeat.getConsumersHeartbeats(redisClient, [consumerId], (err, consumersHeartbeats = {}) => { if (err) cb(err); else cb(null, consumersHeartbeats[consumerId]); }); } static getQueueConsumers(redisClient, queue, transform = false, cb) { consumer_queues_1.consumerQueues.getQueueConsumers(redisClient, queue, transform, cb); } static getQueueConsumerIds(redisClient, queue, cb) { consumer_queues_1.consumerQueues.getQueueConsumerIds(redisClient, queue, cb); } static countQueueConsumers(redisClient, queue, cb) { consumer_queues_1.consumerQueues.countQueueConsumers(redisClient, queue, cb); } } exports.Consumer = Consumer; //# sourceMappingURL=consumer.js.map