如何在Node.js中设置6个月计时器



我正在尝试提前6个月安排社交媒体帖子。我正在使用node-cron,它的灵感来自gnu cron。我设置了一个脚本每秒运行一次以记录"tick!">进行测试。但是,如果此 nodeJS服务重新启动或关闭,则作业将丢失

我认为节点 cron 影响了 Crontab,但Crontab -l返回no crontab for kevindanikowski.

有没有不同(更好(的方式,我应该提前几个月安排工作?

还是我缺少一些关于node-cron的东西,以确保我不会丢失cronjob?

对于非常长期的计时器,您需要以某种方式将超时数据存储在磁盘上。如前所述,如果纯粹在内存中执行此操作,则在服务器重新启动时将丢失计时信息。

处理这个问题的方法很简单。这与 cron 使用的算法相同:

记录您希望在
  1. 磁盘上发生超时的时间 - 格式由您决定,您可以使用 cron 格式或发明自己的格式。由于它是javascript,我很想简单地以JSON格式记录。

  2. 将计时文件读入程序。有两种方法可以做到这一点。如果您担心运行时性能,请在程序启动时阅读一次。但是,这意味着如果编辑文件,则需要重新启动服务器。如果您希望自动选取对文件的更新,请在每次要处理计时事件时读取它。

  3. 定期运行计时器循环。例如,Cron 的分辨率为一分钟。因此,cron 每分钟运行一次计时器循环。如果这足够好,而不是每分钟运行一次。对我来说,我会每30秒左右做一次setInterval()。请注意,在任何像样的处理器上的javascript中,每秒运行一次计时器循环并不是那么繁重。

  4. 在计时器循环中处理文件中的计时器事件。循环遍历所有事件并检查它们是否已过期。

就是这样。这就是所有调度系统的工作方式(谷歌日历、cron 等(。

这是一个非常简单的javascript实现:

var events = require("events.js");
// Assume events.js look something like:
// return [ {
//    timeout: <millisecs like what Date.now() returns>,
//    callback: <function>
// } ]
setInterval(function(){
var now = Date.now();
events.forEach(e=>{
if (e.timeout >= now) {
e.callback(); // execute event
}
});
events = events.filter(e=>e.timeout<now); // remove stale events
},10000); // every 10 seconds

您可以添加花哨的功能,例如如果代码对当前事件进行任何更改,则将当前事件保存到磁盘,使超时格式可读以进行调试,定义系统以将参数传递给事件回调等。但核心很简单。

最新更新