NodeJs上的长setTimeout被事件队列忽略

时间:2019-08-07 05:29:32

标签: javascript node.js

我有一个长期运行的nodejs(v.10.16)应用程序,偶尔需要安排一个事件在将来一到两个月内触发。不幸的是,这超出了超时可以等待的最大时间长度。我尝试使用各种不同的程序包(长时间超时),但它们似乎对我不起作用。

本质上,我确定的代码如下所示

function runInFuture(millisecondsInFuture,callback) {
    if(millisecondsInFuture > MAX_TIMEOUT) { // max timeout === 2^31-1 https://nodejs.org/api/timers.html#timers_settimeout_callback_delay_args
        setTimeout(()=>{
            runInFuture(millisecondsInFuture - MAX_TIMEOUT,callback); //for simplicity, code to ensure no errors from floating point numbers excluded
        },MAX_TIMEOUT - 1);
     } else {  // timing is within setTimeout's ability to run 
        setTimeout(()=>{
            callback();
        },millisecondsInFuture);
     }
}

据我了解,以上函数应每隔约24.86天递归调用一次,直到预计该事件在不到该时间发生之前,此后它将触发回调。实际上,不会触发回调。我没有关注的nodejs上有任何设置吗?有关在哪里找到错误的任何提示?或者,是否有可能以某种方式“加速”系统时钟,这样我不必等待25天就能发现我的代码不起作用?

1 个答案:

答案 0 :(得分:0)

我知道您说您尝试过一些库,但是Agenda似乎可以很好地满足您的目的。如您所知,setTimeout的32位限制不到25天,并且由于仅存储在内存中而容易受到系统故障的影响。如有必要,可以在服务器重新启动时从参考计划恢复到议程计划。