问题描述
egg 项目的定时器,设置每隔1分钟执行一次,在服务端,在一分钟区间内会执行两次。但本地开发环境没有该问题。使用 parser.parseExpression(xxx, opionts).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