使用 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
编辑
Job
在Agenda
时返回
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: true
与 repeatEvery
结合使用,我遇到了打字稿错误。行
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");
我正在使用 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
编辑
Job
在Agenda
时返回
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: true
与 repeatEvery
结合使用,我遇到了打字稿错误。行
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");