import * as cron from 'node-cron'; import { prisma } from './prisma'; // 定时任务管理器 class TaskScheduler { private tasks: Map = new Map(); // 启动所有定时任务 startAll() { this.scheduleHourlyTask(); this.scheduleDailyCleanup(); console.log('All scheduled tasks started'); } // 每小时第30分钟执行的任务 private scheduleHourlyTask() { const task = cron.schedule('30 * * * *', async () => { console.log('Running hourly task at minute 30...'); try { await this.hourlyTaskHandler(); } catch (error) { console.error('Hourly task failed:', error); } }); this.tasks.set('hourlyTask', task); console.log('Hourly task scheduled (every hour at minute 30)'); } // 每日凌晨2点清理任务 private scheduleDailyCleanup() { const task = cron.schedule('0 2 * * *', async () => { console.log('Running daily cleanup task...'); try { await this.dailyCleanupHandler(); } catch (error) { console.error('Daily cleanup task failed:', error); } }); this.tasks.set('dailyCleanup', task); console.log('Daily cleanup task scheduled (2:00 AM every day)'); } // 每小时执行的具体任务逻辑 private async hourlyTaskHandler() { // 在这里添加你的业务逻辑 // 例如:清理过期数据、同步数据、发送通知等 // 示例:清理30天前的记录 const thirtyDaysAgo = new Date(); thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); // 根据你的数据库结构调整这个查询 // const result = await prisma.someTable.deleteMany({ // where: { // createdAt: { // lt: thirtyDaysAgo // } // } // }); console.log(`Hourly task completed at ${new Date().toISOString()}`); } // 每日清理任务的具体逻辑 private async dailyCleanupHandler() { // 在这里添加每日清理逻辑 // 例如:清理临时文件、压缩日志、备份数据等 console.log(`Daily cleanup completed at ${new Date().toISOString()}`); } // 停止指定任务 stopTask(taskName: string) { const task = this.tasks.get(taskName); if (task) { task.stop(); console.log(`Task ${taskName} stopped`); } } // 停止所有任务 stopAll() { this.tasks.forEach((task, name) => { task.stop(); console.log(`Task ${name} stopped`); }); this.tasks.clear(); } // 获取任务状态 getTaskStatus(taskName: string): boolean { const task = this.tasks.get(taskName); return task ? true : false; // 如果任务存在则认为正在运行 } // 列出所有任务 listTasks(): string[] { return Array.from(this.tasks.keys()); } } // 导出单例实例 export const taskScheduler = new TaskScheduler(); // Cron 表达式说明: // ┌───────────── 分钟 (0 - 59) // │ ┌─────────── 小时 (0 - 23) // │ │ ┌───────── 日期 (1 - 31) // │ │ │ ┌─────── 月份 (1 - 12) // │ │ │ │ ┌───── 星期 (0 - 7, 0和7都是周日) // │ │ │ │ │ // * * * * * // 常用示例: // '30 * * * *' - 每小时的第30分钟 // '0 */2 * * *' - 每2小时执行一次 // '0 9 * * 1-5' - 周一到周五上午9点 // '0 0 1 * *' - 每月1号凌晨执行 // '*/15 * * * *' - 每15分钟执行一次