/** * 聊天会话清理服务 * * 功能描述: * - 定时清理过期会话 * - 释放相关资源 * - 管理Zulip队列清理 * * 架构层级:Business Layer(业务层) * * 最近修改: * - 2026-01-14: 代码规范优化 - 移除未使用的依赖 (修改者: moyin) * - 2026-01-14: 代码规范优化 - 补充类级别JSDoc注释 (修改者: moyin) * - 2026-01-14: 代码规范优化 - 完善文件头注释和方法注释规范 (修改者: moyin) * * @author moyin * @version 1.0.3 * @since 2026-01-14 * @lastModified 2026-01-14 */ import { Injectable, Logger, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; import { ChatSessionService } from './chat_session.service'; /** * 聊天会话清理服务类 * * 职责: * - 定时检测和清理过期会话 * - 释放Zulip队列等相关资源 * - 维护系统资源的健康状态 * * 主要方法: * - triggerCleanup() - 手动触发会话清理 * * 使用场景: * - 系统启动时自动开始定时清理任务 * - 管理员手动触发清理操作 */ @Injectable() export class ChatCleanupService implements OnModuleInit, OnModuleDestroy { private readonly logger = new Logger(ChatCleanupService.name); private cleanupInterval: NodeJS.Timeout | null = null; private readonly CLEANUP_INTERVAL_MS = 5 * 60 * 1000; // 5分钟 private readonly SESSION_TIMEOUT_MINUTES = 30; constructor( private readonly sessionService: ChatSessionService, ) {} async onModuleInit() { this.logger.log('启动会话清理定时任务'); this.startCleanupTask(); } async onModuleDestroy() { this.logger.log('停止会话清理定时任务'); this.stopCleanupTask(); } private startCleanupTask() { this.cleanupInterval = setInterval(async () => { await this.performCleanup(); }, this.CLEANUP_INTERVAL_MS); } private stopCleanupTask() { if (this.cleanupInterval) { clearInterval(this.cleanupInterval); this.cleanupInterval = null; } } private async performCleanup() { const startTime = Date.now(); this.logger.log('开始执行会话清理'); try { const result = await this.sessionService.cleanupExpiredSessions(this.SESSION_TIMEOUT_MINUTES); // 清理Zulip队列 for (const queueId of result.zulipQueueIds) { try { // 这里可以添加Zulip队列清理逻辑 this.logger.debug('清理Zulip队列', { queueId }); } catch (error) { this.logger.warn('清理Zulip队列失败', { queueId, error: (error as Error).message }); } } const duration = Date.now() - startTime; this.logger.log('会话清理完成', { cleanedCount: result.cleanedCount, zulipQueueCount: result.zulipQueueIds.length, duration, }); } catch (error) { this.logger.error('会话清理失败', { error: (error as Error).message }); } } /** * 手动触发清理 * @returns 清理结果,包含清理的会话数量 */ async triggerCleanup(): Promise<{ cleanedCount: number }> { const result = await this.sessionService.cleanupExpiredSessions(this.SESSION_TIMEOUT_MINUTES); return { cleanedCount: result.cleanedCount }; } }