diff --git a/backend/src/services/redis.service.ts b/backend/src/services/redis.service.ts index 102d4ca..95bfe5d 100644 --- a/backend/src/services/redis.service.ts +++ b/backend/src/services/redis.service.ts @@ -51,6 +51,7 @@ export class RedisService extends EventEmitter { const onError = (error: Error) => { this.logger.error('Redis Error', error); + this.emit('redisError', error); }; const onDisconnect = () => { @@ -84,6 +85,10 @@ export class RedisService extends EventEmitter { this.on('redisConnected', callback); } + public onceError(callback: () => void) { + this.once('redisError', callback); + } + /** * Publishes a message to a specified Redis channel. * diff --git a/backend/src/services/system-event.service.ts b/backend/src/services/system-event.service.ts index 34697eb..e9ea9f7 100644 --- a/backend/src/services/system-event.service.ts +++ b/backend/src/services/system-event.service.ts @@ -72,6 +72,10 @@ export class SystemEventService { this.redisService.onReady(callback); } + onceRedisError(callback: () => void) { + this.redisService.onceError(callback); + } + /** * Handles incoming messages from Redis, parses them as system events, * and emits the corresponding event to all registered listeners. diff --git a/backend/src/services/task-scheduler.service.ts b/backend/src/services/task-scheduler.service.ts index b967a6b..525decf 100644 --- a/backend/src/services/task-scheduler.service.ts +++ b/backend/src/services/task-scheduler.service.ts @@ -32,6 +32,14 @@ export class TaskSchedulerService { this.scheduleTask(task); }); this.started = true; + + this.systemEventService.onceRedisError(() => { + this.logger.debug('Redis shutdown detected. Cancelling all scheduled tasks...'); + this.scheduledTasks.forEach((task, name) => { + this.cancelTask(name); + }); + this.started = false; + }); }); }