redis-smq
Version:
A simple high-performance Redis message queue for Node.js.
68 lines • 2.76 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.MultiplexedMessageHandlerRunner = void 0;
const redis_smq_common_1 = require("redis-smq-common");
const multiplexed_message_handler_js_1 = require("../message-handler/multiplexed-message-handler.js");
const message_handler_runner_js_1 = require("./message-handler-runner.js");
class MultiplexedMessageHandlerRunner extends message_handler_runner_js_1.MessageHandlerRunner {
constructor(consumer, redisClient, logger, eventBus) {
super(consumer, redisClient, logger, eventBus);
this.index = 0;
this.activeMessageHandler = null;
this.execNextMessageHandler = () => {
this.activeMessageHandler = this.getNextMessageHandler();
if (this.activeMessageHandler && this.activeMessageHandler.isRunning()) {
this.activeMessageHandler.dequeue();
}
else {
this.nextTick();
}
};
this.timer = new redis_smq_common_1.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;
}
createMessageHandlerInstance(handlerParams) {
const instance = new multiplexed_message_handler_js_1.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();
}
}
exports.MultiplexedMessageHandlerRunner = MultiplexedMessageHandlerRunner;
//# sourceMappingURL=multiplexed-message-handler-runner.js.map