Node.js中setTimeout的定期任务停止运行

时间:2018-05-23 21:46:16

标签: javascript node.js

在Node.js应用程序中,我需要每10秒运行一次后台任务(一般意义上的任务)。大多数情况下,此任务是一个简单的轮询另一个Web服务,并且该Web服务中的所有内容都会发生变化,后台任务会更新我的应用程序的内部状态。仅供参考,此应用程序在Openshift部署中的Docker容器中运行。

今天我意识到后台任务已经停止执行。日志文件未显示任何异常或其他可疑消息。 Openshift pod的CPU和内存消耗看起来很正常。遗憾的是,我没有启用 verbose 日志级别,只有 info ,而我在Linux上的技能还不足以进行进程转储并对其进行分析。

我想知道我是否在实施此后台任务时遇到了错误。此外,这是我第一次遇到这个(AFAIK)并且应用程序已经开发了一年多了,应用程序实例有时会运行2个月或更长时间而没有问题。

let pollingActive = true;
let pollingInterval = 10000;

const pollingMethod = () => {
    if (!this.pollingActive) {
        return;
    }

    logger.verbose('Start of synchronization cycle.');
    performSync() // this is the polling and internal state update work
    .then(() => {
        this.pollingHandle = setTimeout(() => { pollingMethod(); },
            this.pollingInterval);
    })
    .catch(err => {
        logger.info('Error while synchronizing.', err);
        this.pollingHandle = setTimeout(() => { pollingMethod(); },
            this.pollingInterval);
    });
};

pollingMethod();

我仔细检查了我的代码,唯一一次 pollingActive 变为false是Node.js应用程序关闭时,我知道它没有,因为它仍然响应常规REST API请求

知道为什么这个后台任务可能已停止工作了吗?

旁注:我确信有更好的方法可以在Node.js或Docker容器中执行后台任务,包括让外部Web服务通过队列发送更改通知(可能仍需要轮询; - )但是,由于这个项目处于“出路”状态,我无法做出重大改变。

1 个答案:

答案 0 :(得分:0)

这是一个有趣的,目前,对我来说,究竟可能发生的事情仍然是个谜。我们需要更多信息。但它确实让我在what NodeJS says about timers找到了一些有趣的信息:

  

在该精确的毫秒数之后执行的超时间隔不能依赖于执行。这是因为阻塞或保留在事件循环上的其他执行代码将推迟执行超时。唯一的保证是超时不会比声明的超时间隔更早执行。

显然,他们不会对计时器何时被解雇提供任何保证。就个人而言,我建议你使用操作系统提供的东西,如果这是可能的话。尝试查看d = -10:10; stem(d,abs(Xk(d))) ,一个在OS中安排任务的系统(linux等)。 This Stackoverflow question有一些很好的指针和链接可以继续阅读。