Mui*_*rik 0 mongodb node.js agenda
我agenda.js在我的 Node 项目中使用它,由 MongoDB 数据库支持,来处理我们需要运行的批处理过程。这运作良好。不过,我确实有一个关于时区的问题。当我使用该every()操作时,它似乎接受作业名称和时间表。所以我一直在数据库中播种作业,如下所示:
for (let job of dbJobs) {
await agenda.every(schedule, job.name);
}
Run Code Online (Sandbox Code Playgroud)
请注意,上面的内容schedule采用 cron 格式 - 00 05 * * 1-5。
这有效。然而,据我所知,every()不接受 的争论repeatTimezone。那么在这些情况下它是如何计算时区的呢?
澄清一下,当我使用 添加作业后查看数据库中的文档时every(),该repeatTimezone属性存在,但其值设置为null。
其他agenda操作(例如repeatEvery())确实接受时区参数,如下所示:
job.repeatEvery('0 6 * * *', {
timezone: 'America/New_York'
});
Run Code Online (Sandbox Code Playgroud)
自从我使用 以来every(),我一直通过首先使用 播种数据库every(),然后运行 MongoupdateMany()将 timzeone 显式添加到所有作业来管理此操作:
async function addTimezoneToJobs() {
try {
const db = await client.db(dbName);
await db.collection('batch_processes').updateMany({}, {
$set: {
repeatTimezone: 'America/New_York'
}
});
} catch (error) {
console.log(error);
}
}
Run Code Online (Sandbox Code Playgroud)
但奇怪的是,即使我没有像我这样做时那样明确地将属性值添加到作业中,agenda似乎也会计算相同的时间。repeatTimezone
这里发生了什么我不明白的事情?运行时间是如何计算的every(),有没有办法传入时区?
仅供参考:我与需要在数据库中设置的时区不在同一时区。
您的问题似乎分为两部分,我不确定我能否很好地解释它,但让我尝试一下
所以,你的第一个问题
但是,据我所知,
every()不接受时区的争论
从技术上讲,您也可以添加Timezone选项,因为此方法的作用是内部调用,并且您已经知道可以添加该选项。为了支持我的答案,我找到了2个证据every()job.repeatEverytimezone
every接受 4 个参数每个(间隔,名称,[数据],[选项])
options是一个可选参数,将传递给job.repeatEvery. 为了使用此参数,还必须指定数据。
所以如果你也通过的话技术上也可以通过timezonedata
job.repeatEvery(interval, options)在内部使用。现在,回答你的第二个问题
在这些情况下它是如何计算时区的?
嗯,他们有一个非常独特但必需的模块,名为ComputeNextRunAt()。
所以我浏览了他们的源代码,发现这是根据startingTime和Interval来计算你的工作下一次运行的时间。
您的代码之所以有效,是因为您在工作中曾经(最初)提到过遵循America/New_York时区,因此每个下一个工作间隔都是基于此计算的,这就是您不需要再次指定它的原因。
因此,如果最初您没有指定时区属性,您会得到您的时区属性local Timezone,但现在您这样做了,它会根据该属性计算下一个间隔。
| 归档时间: |
|
| 查看次数: |
2106 次 |
| 最近记录: |