使用 Agenda.js 和 Node 安排重复的日常工作

Scheduling Repeating Daily Jobs with Agenda.js and Node

我正在使用 Agenda.js 和 Node 设置作业调度程序,并以 MongoDB 为后盾。到目前为止,它按预期工作。但是,我不清楚如何安排重复工作——例如,每天上午 9 点应该 运行 的工作。

"schedule"用于作业的一次性调度,不重复:

agenda.schedule('today at 09:00am CST', 'first job');

"every" 适用于“3 分钟”之类的间隔,但不适用于 "day at 9:00am"

agenda.every('3 minutes', 'second job');

因为配置方法应该是可链接的,所以我也尝试了这个:

agenda.processEvery('24 hours').schedule('day at 09:45am CST', 'second job');

...这 运行 任务在 9:45am CST 第一次到达时成功完成,但它并没有在第二天同时将其重置为 运行。

我每天 运行 在 9:00am 的工作中使用什么语法?而且,更好的是,我如何才能将其安排在 运行 仅在周一至周五?

Ajenda 接受 cron 格式。所以你可以这样做

这是重复作业 在 09:00 从周一到周五每周的每一天

job.repeatEvery('0 9 * * 1-5', {
    skipImmediate: true
});

SkipImmediate 是可选的。这里是CRON checker for above cron string. Read more about repeatEvery

编辑

JobAgenda时返回

agenda.define('NAME', async job => {
            job.repeatEvery('0 9 * * 1-5', {
                skipImmediate: true
            });
            await job.save()
        }

阅读更多关于 Creating Jobs

我有一个类似的用例,但我不想使用 cron 字符串。

const agendaEvery = async (interval, sendTime, name, data, options) => {
  const job = agenda
    .create(name, data)
    .repeatEvery(interval, {
      timezone: 'Asia/Kuala_Lumpur',
      skipImmediate: true,
      startDate: sendTime
    })
    .schedule(sendTime)
  await job.save()
}

这将允许假设您想每天发送一封电子邮件,您可以使用 ISO 格式的日期时间字符串来安排第一封邮件,间隔可以是 1 day.

skipImmediate: truerepeatEvery 结合使用,我遇到了打字稿错误。行

agenda.every('0 9 * * 1-5', cronTypes.PUSH, null, {skipImmediate: true});

工作

批准的解决方案似乎有点古怪。我觉得在作业处理程序中调用 job.repeatEvery() 有点不合适。

agenda.every 接受 cron 格式,因此您可以根据 [=] 将其应用于任何定义的作业和 运行 处理程序13=]序列

您有一份明确的工作:

agenda.define('do-something', async (job, done) => {
  // Doing some heavy async stuff here
  async heavyStuff();
  done();
})

服务器初始化后您可以在代码中的任何地方调用它来设置重复作业。只需确保已调用 await agenda.start() 并且议程已建立 mongo 连接

await agenda.every("0 9 * * 1-5", "do-something");