index.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. "use strict";
  2. // oms/services/cron-jobs/index.ts
  3. var __importDefault = (this && this.__importDefault) || function (mod) {
  4. return (mod && mod.__esModule) ? mod : { "default": mod };
  5. };
  6. Object.defineProperty(exports, "__esModule", { value: true });
  7. exports.startCronJobs = startCronJobs;
  8. const node_cron_1 = __importDefault(require("node-cron")); // Import node-cron library
  9. const database_1 = require("../../src/database");
  10. // Define the settings array for cron jobs
  11. // Each element: [name: string, schedule: string, jobModule: CronJobModule]
  12. const settings = [
  13. // 假设这些文件将存在于 oms/services/cron-jobs/ 目录下
  14. ["done-rate", "10 0 * * *", require("./done-rate2")], // 每天凌晨0点10分, 统计作品完成率
  15. ["daily-activity-detector", "50 0 * * *", require("./daily-activity-detector")], // 每天凌晨0点50分, 检查是否需要生成新的推送消息
  16. ["message-sender", "*/5 * * * *", require("./message-sender")], // 每5分钟运行一次
  17. ["active-user-daily-notify", "30 18 * * *", require("./active-user-daily-notify")], // 每天下午6点,开始活跃用户新作品消息推送
  18. ];
  19. /**
  20. * Starts all scheduled cron jobs.
  21. * Includes database connection and task scheduling.
  22. * @returns Promise<void>
  23. */
  24. async function startCronJobs() {
  25. console.log("[Cron Jobs] Initializing all scheduled tasks...");
  26. // 在启动所有定时任务之前,首先建立数据库连接
  27. await (0, database_1.connectToDatabase)();
  28. // Iterate through settings and schedule each job
  29. settings.forEach((setting) => {
  30. const [name, schedule, job] = setting;
  31. if (!job || typeof job.run !== "function") {
  32. // Check if job module and run function exist
  33. console.error(`[Cron Jobs] Job [${name}] is missing a run() function or is not a valid module. Skipping.`);
  34. return;
  35. }
  36. console.log(`[Cron Jobs] Installing job [${name}] to run at '${schedule}'`);
  37. node_cron_1.default.schedule(schedule, async () => {
  38. const startTime = new Date().toLocaleString();
  39. console.log(`[Cron Jobs] Running job [${name}]@'${schedule}' started @ ${startTime}`);
  40. try {
  41. const result = await job.run(); // Execute the job's run function
  42. console.log(`[Cron Jobs] Job [${name}] completed successfully @ ${new Date().toLocaleString()}. Result:`, result);
  43. }
  44. catch (error) {
  45. console.error(`[Cron Jobs] Job [${name}] failed @ ${new Date().toLocaleString()}. Error:`, error);
  46. }
  47. });
  48. });
  49. console.log("[Cron Jobs] All cron jobs started.");
  50. }
  51. // If this file is run directly (e.g., using `node dist/services/cron-jobs/index.js`)
  52. if (require.main === module) {
  53. startCronJobs().catch((error) => {
  54. console.error("[Cron Jobs] Failed to start cron jobs:", error);
  55. process.exit(1);
  56. });
  57. // Handle graceful shutdown
  58. process.on("SIGINT", async () => {
  59. console.log("[Cron Jobs] Shutting down...");
  60. node_cron_1.default.getTasks().forEach((task) => task.stop()); // Stop all scheduled tasks
  61. // await disconnectFromDatabase(); // 在退出前断开数据库连接
  62. console.log("[Cron Jobs] All cron tasks stopped.");
  63. process.exit(0);
  64. });
  65. process.on("SIGTERM", async () => {
  66. console.log("[Cron Jobs] Shutting down...");
  67. node_cron_1.default.getTasks().forEach((task) => task.stop());
  68. // await disconnectFromDatabase(); // 在退出前断开数据库连接
  69. console.log("[Cron Jobs] All cron tasks stopped.");
  70. process.exit(0);
  71. });
  72. }