egg 定时器,服务器端重复执行问题

370 阅读1分钟

问题描述

egg 项目的定时器,设置每隔1分钟执行一次,在服务端,在一分钟区间内会执行两次。但本地开发环境没有该问题。使用 parser.parseExpression(xxx, opionts).next() 方法时,服务端一分钟区间内,会返回两次相同的值。

例如在这两个时间 获取的 next 却是同一个时间

日志打印时间

日志打印时间

next 时间

next时间

这里的 next 的第二次时间应该是 2023-06-13 才对。

代码示例

import * as parser from 'cron-parser';
import { Subscription } from 'egg';

export default class CleanDB extends Subscription {
  static get schedule() {
    return {
      interval: '60s', // 1 分钟间隔
      type: 'worker', // 随机一个 worker 来执行定时任务 如果设置的是 all 可能重复执行的就不止两次了
    };
  }

  async subscribe() {
      const options = {
          tz: 'Asia/ShangHai',
      };
      // 需要定时执行的 task
      // 你可能需要判断 task 下一次执行时间
      const nextTime = parser.parseExpression(task.cron_style_string, options);
      const next = nextTime.next().getTime(); // 问题出现在这里
  }
}

问题解决

是服务器端的时区问题,只需要在 schedule 设置同一个时区,即可解决。

static get schedule() {
    return {
      interval: '60s', // 1 分钟间隔
      type: 'worker',
      cronOptions: {
        tz: 'Asia/ShangHai',
      },
    };
}

相关参考地址

GitHub - eggjs/egg-schedule: Schedule plugin for egg

GitHub - harrisiirak/cron-parser: Node.js library for parsing crontab instructions