index.ts 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // oms/services/cron-jobs/index.ts
  2. import cron from "node-cron"; // Import node-cron library
  3. import { initializeClients, clickhouseService } from "../../src/services/clients"; // 从新的文件导入
  4. // Define an interface for a cron job module
  5. interface CronJobModule {
  6. run: () => Promise<any>; // Expecting a run function that returns a Promise
  7. }
  8. // Define the settings array for cron jobs
  9. // Each element: [name: string, schedule: string, jobModule: CronJobModule]
  10. const settings: [string, string, CronJobModule][] = [
  11. // 假设这些文件将存在于 oms/services/cron-jobs/ 目录下
  12. ["done-rate", "10 0 * * *", require("./done-rate2") as CronJobModule], // 每天凌晨0点10分, 统计作品完成率
  13. ["daily-activity-detector", "50 0 * * *", require("./daily-activity-detector") as CronJobModule], // 每天凌晨0点50分, 检查是否需要生成新的推送消息
  14. // ["message-sender", "*/5 * * * *", require("./message-sender") as CronJobModule], // 每5分钟运行一次, 已经单独剥离出去了(message-seender-service),定时任务这里取消了
  15. // ["active-user-daily-notify", "30 18 * * *", require("./active-user-daily-notify") as CronJobModule], // 每天下午6点,开始活跃用户新作品消息推送
  16. // ["fcm-notify", "30 18 * * *", require("./fcm-notify") as CronJobModule], // 每天下午6点,基于原来的active-user-daily-notify,增加schedule推送,AB测试
  17. ["daily-notify-at-morning", "0 19 * * *", require("./notify/daily-notify-at-morning") as CronJobModule], // 每天下午7点,对应巴西时间早上8点推送一轮
  18. ["daily-notify-at-midday", "0 23 * * *", require("./notify/daily-notify-at-midday") as CronJobModule], // 每天下午7点,对应巴西时间中午12点推送一轮
  19. ["daily-notify-at-evening", "0 3 * * *", require("./notify/daily-notify-at-evening") as CronJobModule], // 每天凌晨3点,对应巴西时间下午4点
  20. ["daily-notify-at-afternoon", "0 7 * * *", require("./notify/daily-notify-at-afternoon") as CronJobModule], // 每天上午7点,对应巴西时间晚上8点
  21. ];
  22. /**
  23. * Starts all scheduled cron jobs.
  24. * Includes database connection and task scheduling.
  25. * @returns Promise<void>
  26. */
  27. export async function startCronJobs(): Promise<void> {
  28. console.log("[Cron Jobs] Initializing all scheduled tasks...");
  29. // 先初始化客户端服务
  30. await initializeClients();
  31. // Iterate through settings and schedule each job
  32. settings.forEach((setting) => {
  33. const [name, schedule, job] = setting;
  34. if (!job || typeof job.run !== "function") {
  35. // Check if job module and run function exist
  36. console.error(`[Cron Jobs] Job [${name}] is missing a run() function or is not a valid module. Skipping.`);
  37. return;
  38. }
  39. console.log(`[Cron Jobs] Installing job [${name}] to run at '${schedule}'`);
  40. cron.schedule(schedule, async () => {
  41. const startTime = new Date().toLocaleString();
  42. console.log(`[Cron Jobs] Running job [${name}]@'${schedule}' started @ ${startTime}`);
  43. try {
  44. const result = await job.run(); // Execute the job's run function
  45. console.log(`[Cron Jobs] Job [${name}] completed successfully @ ${new Date().toLocaleString()}. Result:`, result);
  46. } catch (error) {
  47. console.error(`[Cron Jobs] Job [${name}] failed @ ${new Date().toLocaleString()}. Error:`, error);
  48. }
  49. });
  50. });
  51. console.log("[Cron Jobs] All cron jobs started.");
  52. }
  53. // If this file is run directly (e.g., using `node dist/services/cron-jobs/index.js`)
  54. if (require.main === module) {
  55. startCronJobs().catch((error) => {
  56. console.error("[Cron Jobs] Failed to start cron jobs:", error);
  57. process.exit(1);
  58. });
  59. // Handle graceful shutdown
  60. process.on("SIGINT", async () => {
  61. console.log("[Cron Jobs] Shutting down...");
  62. cron.getTasks().forEach((task) => task.stop()); // Stop all scheduled tasks
  63. // await disconnectFromDatabase(); // 在退出前断开数据库连接
  64. console.log("[Cron Jobs] All cron tasks stopped.");
  65. process.exit(0);
  66. });
  67. process.on("SIGTERM", async () => {
  68. console.log("[Cron Jobs] Shutting down...");
  69. cron.getTasks().forEach((task) => task.stop());
  70. // await disconnectFromDatabase(); // 在退出前断开数据库连接
  71. console.log("[Cron Jobs] All cron tasks stopped.");
  72. process.exit(0);
  73. });
  74. }