我在NPM中使用cron库。
我想为用户创建事件,创建预计在事件发生后一个月内执行的作业。
让我们说这是我的代码:
function userSignedUpEvent(user) {
var today = new Date();
today.setDate(today.getDate() + 30);
let cronSignature = `${today.getMinutes()} ${today.getHours()} ${today.getDate()} ${today.getMonth()} *`
let reminderJob = new CronJob(cronSignature,
() => {
user.sendEmail("It has been a month since you joined us!");
}, null, true, "Asia/Jerusalem");
}
问题是如果服务器在cron签名的确切时间关闭,代码将永远不会被执行。
我的情况是否有办法保存这些作业并在服务器再次启动时再次签名?
理论上,我可以将他们的签名保存在我的数据库中并自己实现,但我想确保没有驱动方法来实现它。
答案 0 :(得分:0)
正如您所提到的,您必须以某种方式将其记录为“已完成”。
我不相信cron
包提供任何直接的方法。
有很多方法。如果您已经在使用具有用户特定数据的数据库,那肯定是存储它的最合理的地方。
另一种选择是将其存储在某种平面文件中。
另一种方法可能是建立一个队列,在完成任务时读取作业。
当用户注册时,您可以将它们的记录添加到队列的底部,可能还有一个时间戳,因为在运行之前会有很长的延迟。这意味着队列将按时间顺序排列,最快的项目位于顶部,最新位于底部。
队列背后的技术有点无关紧要。它可以像纯文本文件一样简单,也可以像Kafka queue
那样复杂然后你的程序可以经常查看队列的第一行。如果该项目已准备就绪,请执行您需要执行的操作,然后将其从队列中删除。如果没有,请不要管它并在一段时间后再次检查。
这样,该项目在完成之前仍然在队列中,即使你的程序在启动时关闭,它仍然会在启动时启动。
答案 1 :(得分:0)
所以我在这个项目中实现了这个: crone-durability