我有一个长期运行的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天就能发现我的代码不起作用?
答案 0 :(得分:0)
我知道您说您尝试过一些库,但是Agenda似乎可以很好地满足您的目的。如您所知,setTimeout
的32位限制不到25天,并且由于仅存储在内存中而容易受到系统故障的影响。如有必要,可以在服务器重新启动时从参考计划恢复到议程计划。