import { JobQueue } from './types.js' import { MemoryQueue } from './MemoryQueue.js' /** * 任务队列工厂类 * * 根据环境变量自动选择队列实现: * - QUEUE_TYPE=memory: 使用MemoryQueue(内存队列) * - QUEUE_TYPE=database: 使用DatabaseQueue(数据库队列,待实现) * * 零代码切换: * - 本地开发:不配置QUEUE_TYPE,默认使用memory * - 云端部署:配置QUEUE_TYPE=database(多实例共享) * * @example * ```typescript * import { jobQueue } from '@/common/jobs' * * // 业务代码不关心是memory还是database * const job = await jobQueue.push('asl:screening', { projectId: 123 }) * ``` */ export class JobFactory { private static instance: JobQueue | null = null /** * 获取任务队列实例(单例模式) */ static getInstance(): JobQueue { if (!this.instance) { this.instance = this.createQueue() } return this.instance } /** * 创建任务队列 */ private static createQueue(): JobQueue { const queueType = process.env.QUEUE_TYPE || 'memory' switch (queueType) { case 'memory': return this.createMemoryQueue() case 'database': // TODO: 实现DatabaseQueue console.warn('[JobFactory] DatabaseQueue not implemented yet, fallback to MemoryQueue') return this.createMemoryQueue() default: console.warn(`[JobFactory] Unknown QUEUE_TYPE: ${queueType}, fallback to memory`) return this.createMemoryQueue() } } /** * 创建内存队列 */ private static createMemoryQueue(): MemoryQueue { console.log('[JobFactory] Using MemoryQueue') const queue = new MemoryQueue() // 定期清理已完成的任务(避免内存泄漏) if (process.env.NODE_ENV !== 'test') { setInterval(() => { queue.cleanup() }, 60 * 60 * 1000) // 每小时清理一次 } return queue } /** * 重置实例(用于测试) */ static reset(): void { this.instance = null } }