redis-smq-common
Version:
Provides essential components and utilities shared across RedisSMQ packages.
96 lines • 3.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WorkerHandler = void 0;
const index_js_1 = require("../../runnable/index.js");
class WorkerHandler extends index_js_1.Runnable {
constructor({ logger }) {
super();
this.workers = new Map();
this.logger = logger.createLogger(this.constructor.name);
}
finalizeUp() {
super.finalizeUp();
this.logger.debug(`All ${this.workers.size} workers started successfully`);
}
goingUp() {
const workers = this.getAllWorkers();
if (workers.length === 0) {
this.logger.warn('No workers to run');
return super.goingUp();
}
const tasks = workers.map((worker, index) => {
return (done) => {
this.logger.debug(`Starting worker ${index + 1}/${workers.length} (ID: ${worker.getId()})`);
worker.run((err) => {
if (err) {
this.logger.error(`Failed to start worker ${worker.getId()}: ${err.message}`, err);
}
else {
this.logger.debug(`Worker ${worker.getId()} started successfully`);
}
done(err);
});
};
});
return super.goingUp().concat(tasks);
}
finalizeDown() {
super.finalizeDown();
this.logger.debug(`All workers stopped`);
}
goingDown() {
const workers = this.getAllWorkers();
if (workers.length === 0) {
this.logger.debug('No workers to stop');
return super.goingDown();
}
this.logger.debug(`Stopping ${workers.length} workers...`);
const tasks = workers.map((worker, index) => {
return (done) => {
this.logger.debug(`Shutting down worker ${index + 1}/${workers.length} (ID: ${worker.getId()})`);
worker.shutdown((err) => {
if (err) {
this.logger.warn(`Worker shutdown failed for ${worker.getId()}: ${err.message}`);
}
done();
});
};
});
return tasks.concat(super.goingDown());
}
addWorker(worker) {
if (this.isOperational())
throw new Error('Instance must be shut down before managing workers');
this.workers.set(worker.getId(), worker);
this.logger.debug(`Worker added: ${worker.getWorkerFilename()}, total: ${this.workers.size}`);
}
removeWorker(workerId) {
if (this.isOperational())
throw new Error('Instance must be shut down before managing workers');
const removed = this.workers.delete(workerId);
if (removed) {
this.logger.debug(`Worker removed: ${workerId}, remaining: ${this.workers.size}`);
}
return removed;
}
getWorker(workerId) {
return this.workers.get(workerId);
}
getAllWorkers() {
return Array.from(this.workers.values());
}
hasWorkers() {
return this.workers.size > 0;
}
count() {
return this.workers.size;
}
clear() {
if (this.isOperational())
throw new Error('Instance must be shut down before managing workers');
this.workers.clear();
this.logger.debug('All workers cleared');
}
}
exports.WorkerHandler = WorkerHandler;
//# sourceMappingURL=worker-handler.js.map