UNPKG

redis-smq

Version:

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

65 lines 2.4 kB
import { Timer } from 'redis-smq-common'; import { MultiplexedMessageHandler } from '../message-handler/multiplexed-message-handler.js'; import { MessageHandlerRunner } from './message-handler-runner.js'; export class MultiplexedMessageHandlerRunner extends MessageHandlerRunner { timer; index = 0; activeMessageHandler = null; constructor(consumer, redisClient, logger, eventBus) { super(consumer, redisClient, logger, eventBus); this.timer = new Timer(); this.timer.on('error', (err) => this.handleError(err)); } nextTick() { if (this.isRunning()) { this.activeMessageHandler = null; this.timer.setTimeout(() => this.execNextMessageHandler(), 1000); } } getNextMessageHandler() { if (this.index >= this.messageHandlerInstances.length) { this.index = 0; } const messageHandler = this.messageHandlerInstances[this.index]; if (this.messageHandlerInstances.length > 1) { this.index += 1; } return messageHandler; } execNextMessageHandler = () => { this.activeMessageHandler = this.getNextMessageHandler(); if (this.activeMessageHandler && this.activeMessageHandler.isRunning()) { this.activeMessageHandler.dequeue(); } else { this.nextTick(); } }; createMessageHandlerInstance(handlerParams) { const instance = new MultiplexedMessageHandler(this.consumer, this.redisClient, this.logger, handlerParams, this.eventBus, this.execNextMessageHandler); this.messageHandlerInstances.push(instance); this.logger.info(`Created a new instance (ID: ${instance.getId()}) for MessageHandler (${JSON.stringify(handlerParams)}).`); return instance; } shutdownMessageHandler(messageHandler, cb) { super.shutdownMessageHandler(messageHandler, () => { if (messageHandler === this.activeMessageHandler) { this.nextTick(); } cb(); }); } goingUp() { return super.goingUp().concat([ (cb) => { this.execNextMessageHandler(); cb(); }, ]); } goingDown() { this.timer.reset(); return super.goingDown(); } } //# sourceMappingURL=multiplexed-message-handler-runner.js.map