使用agenda库调度任务时nextRunAt默认设置为下一年的问题求助
问题根因
从你输出的任务属性可以看到repeatInterval值为* * * 1 *,这就是nextRunAt被设为2022年1月的核心原因:
agenda的every方法使用的是5位cron表达式规则,格式为分钟 小时 日期 月份 星期,第四位对应的是月份,此处取值为1意味着任务仅在每年1月执行。你创建任务的时间是2021年12月,下一个符合规则的执行时间自然就是2022年1月,你传入的startDate仅会限制任务不能早于该时间执行,不会覆盖cron本身的时间规则。
解决步骤
- 先打印你传入的
scheduler.cron值,确认cron表达式的生成逻辑是否错位:大概率是你生成/拼接cron时,误将月份位固定设为了1,和你的预期规则不符。
举几个常见的正确cron示例供参考:- 每分钟执行一次:
* * * * * - 每天早上8点执行:
0 8 * * * - 每月1号零点执行:
0 0 1 * *
- 每分钟执行一次:
- 你代码中重复调用了两次
await this.agenda.start(),属于冗余代码,仅需在agenda初始化完成后调用一次即可。 - 若调整cron后仍有问题,可以临时手动修改任务的下次执行时间验证任务逻辑是否正常:
观察1秒后是否触发任务打印result.attrs.nextRunAt = new Date(Date.now() + 1000); // 设为1秒后执行 await result.save();Hello world!,排除任务定义本身的异常。
内容的提问来源于stack exchange,提问作者Vitor Ceolin
相关产品推荐
相关产品推荐

