initScheduler.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /**
  2. * 初始化调度器 - 确保某些操作只执行一次
  3. */
  4. const logger = require('../logger');
  5. // 用于跟踪已执行的任务
  6. const executedTasks = new Set();
  7. async function executeOnce(taskId, taskFunction, context = null) {
  8. try {
  9. // 检查任务是否已经执行过
  10. if (executedTasks.has(taskId)) {
  11. logger.debug(`任务 "${taskId}" 已经执行过,跳过执行`);
  12. return null;
  13. }
  14. logger.info(`开始执行一次性任务: ${taskId}`);
  15. // 执行任务
  16. let result;
  17. if (typeof taskFunction === 'function') {
  18. result = await taskFunction(context);
  19. } else {
  20. throw new Error('提供的任务不是一个函数');
  21. }
  22. // 标记任务为已执行
  23. executedTasks.add(taskId);
  24. logger.success(`任务 "${taskId}" 执行完成`);
  25. return result;
  26. } catch (error) {
  27. logger.error(`任务 "${taskId}" 执行失败:`, error);
  28. throw error;
  29. }
  30. }
  31. /**
  32. * 检查任务是否已执行
  33. * @param {string} taskId - 任务唯一标识符
  34. * @returns {boolean} 是否已执行
  35. */
  36. function isTaskExecuted(taskId) {
  37. return executedTasks.has(taskId);
  38. }
  39. /**
  40. * 重置任务执行状态(主要用于测试)
  41. * @param {string} taskId - 任务唯一标识符,如果不提供则重置所有任务
  42. */
  43. function resetTaskStatus(taskId = null) {
  44. if (taskId) {
  45. executedTasks.delete(taskId);
  46. logger.debug(`重置任务 "${taskId}" 的执行状态`);
  47. } else {
  48. executedTasks.clear();
  49. logger.debug('重置所有任务的执行状态');
  50. }
  51. }
  52. /**
  53. * 获取已执行的任务列表
  54. * @returns {Array<string>} 已执行的任务ID列表
  55. */
  56. function getExecutedTasks() {
  57. return Array.from(executedTasks);
  58. }
  59. module.exports = {
  60. executeOnce,
  61. isTaskExecuted,
  62. resetTaskStatus,
  63. getExecutedTasks
  64. };