首页 > 解决方案 > NodeJs 上的长 setTimeout 被事件队列忽略

问题描述

我有一个长期运行的 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 天才能发现我的代码不起作用?

标签: javascriptnode.js

解决方案


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


推荐阅读