2

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

“schedule”用于一次性调度作业,但不重复:

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

“every”适用于“3 分钟”等间隔,但不适用于“上午 9:00 的一天”

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

由于配置方法据说是可链接的,我也试过这个:

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

...这确实在 CST 上午 9:45 第一次到达时成功运行了任务,但它没有将其重置为在第二天的同一时间运行。

我每天早上 9:00 使用什么语法来运行作业?而且,更好的是,我如何安排它仅在周一至周五运行?

4

4 回答 4

4

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

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

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

SkipImmediate是可选的。这是上述字符串的CRON 检查器。cron阅读更多关于repeatEvery

编辑

JobAgenda制作时返回

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

阅读有关创建工作的更多信息

于 2019-10-10T13:55:03.480 回答
0

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

议程.every接受cron格式,因此您可以将其应用于任何已定义的作业并根据cron顺序运行处理程序

你有一个明确的工作:

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");
于 2021-09-26T02:43:49.437 回答
0

使用skipImmediate: true with repeatEvery,我得到一个打字稿错误。线

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

工作过

于 2021-02-16T16:54:46.513 回答
0

我有一个类似的用例,但我不想使用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 格式的日期时间字符串来安排第一个电子邮件,并且间隔可以是 .eg 1 day

于 2020-12-30T06:47:42.910 回答