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

How to set up 6 month timer in node.js

我正在尝试提前最多 6 个月安排社交媒体帖子。我正在使用 node-cron, which was inspired by gnu cron。我每秒将一个 脚本设置为 运行 以记录 'tick!' 以进行测试。但是,如果此 nodeJS 服务重新启动或关闭,作业将丢失

我以为 node-cron 影响了 Crontab,但是 Crontab -l returns no crontab for kevindanikowski

有没有其他(更好)的方法可以让我提前几个月安排工作?

或者我缺少关于 node-cron 的东西以确保我不会丢失 cronjob?

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

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

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

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

  3. 运行 定时循环。例如,Cron 的分辨率为一分钟。因此 cron 运行s 每隔一分钟循环一次定时器。如果这比每分钟 运行 还好的话。对我来说,我会每 30 秒左右执行一次 setInterval()。请注意,运行在任何体面的处理器上 javascript 每秒都在运行一个定时器循环并不那么繁重。

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

就是这样。这就是所有调度系统的工作方式(google 日历、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

您可以添加奇特的功能,例如在代码对当前事件进行任何更改时将其保存到磁盘,使超时格式易于调试以供人类阅读,定义一个系统以将参数传递给事件回调等。但核心很简单。