redis-smq
Version:
A simple high-performance Redis message queue for Node.js.
65 lines • 2.4 kB
JavaScript
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