javascript - 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 天才能发现我的代码不起作用?
解决方案
我知道您说过您尝试了几个库,但议程似乎可以很好地满足您的目的。如您所知setTimeout
,32 位限制不到 25 天,并且由于仅存储在内存中而容易受到系统故障的影响。如果需要,可以在服务器重新启动时从对议程计划的引用中恢复。
推荐阅读
- spring - Spring Boot 本地主机 https 问题
- apache-spark - Yarn 上的 Spark 无法发送 RPC 和 Slave 丢失
- mysql - 有没有更好的方法来区分具有相同字段的两个表?
- python - 在 Python 中指定二进制值的开始和结束
- angular - 无法从“/home/circleci/my-project”中找到模块“@angular-devkit/build-angular”
- angular6 - 如何在进行 http post 服务调用时在正文中传递表单字段值
- azure - 与目标的 Azure 数据湖文件名映射
- php - Woocommerce 产品描述图片未显示
- android - 我正在尝试在 tablayout 中添加动态标题,但基于该标题我想显示不同的产品
- flutter - 安装时颤振显示问题