【问题标题】:Schedule Node.js job every five minutes每五分钟安排一次 Node.js 作业
【发布时间】:2011-12-22 03:43:34
【问题描述】:

我是 node.js 的新手。我需要 node.js 每五分钟查询一次 mongodb,获取特定数据,然后使用 socket.io,允许订阅的 Web 客户端访问这些数据。我已经设置了 socket.io 部分,当然还有 mongo,我只需要知道如何让 node.js 每五分钟运行一次,然后发布到 socket.io。

什么是最好的解决方案?

谢谢

【问题讨论】:

  • 你为什么要使用延时。 socket.io 用于广播实时数据。

标签: mongodb node.js socket.io


【解决方案1】:
var minutes = 5, the_interval = minutes * 60 * 1000;
setInterval(function() {
  console.log("I am doing my 5 minutes check");
  // do your stuff here
}, the_interval);

将该代码保存为 node_regular_job.js 并运行它:)

【讨论】:

  • 如果我想每 5 分钟运行一次的代码运行时间超过 5 分钟会怎样?它会被解雇不止一次吗?
  • with setInterval() 是(如果它是异步的,否则它会阻塞一切),with setTimeout() 并在最后(当它完成时)再次递归调用该函数不。
  • 如果我正在运行“集群”,在这种情况下它将执行多次。正确的?请建议在这种情况下该怎么做。
  • 我是新手,如果年复一年地运行这段代码会怎样?
【解决方案2】:

您可以使用this package

var cron = require('node-cron');

cron.schedule('*/5 * * * *', () => {
  console.log('running a task 5 minutes');
});

【讨论】:

    【解决方案3】:

    如果您有一些异步任务要管理,您应该这样做:

    (function schedule() {
        background.asyncStuff().then(function() {
            console.log('Process finished, waiting 5 minutes');
            setTimeout(function() {
                console.log('Going to restart');
                schedule();
            }, 1000 * 60 * 5);
        }).catch(err => console.error('error in scheduler', err));
    })();
    

    但是你不能保证它什么时候开始,但至少你不会同时运行多次该作业,如果你的作业执行时间超过 5 分钟。

    您仍然可以使用setInterval 来安排异步作业,但如果这样做,您至少应该将已处理的任务标记为“正在处理”,这样如果该作业将在之前第二次安排之前的完成,您的逻辑可能决定不处理仍在处理的任务。

    【讨论】:

      【解决方案4】:

      @alessioalex has the right answer 从代码控制作业时,但其他人可能会偶然发现这里寻找 CLI 解决方案。你打不过sloth-cli

      只需运行,例如,sloth 5 "npm start" 以每 5 分钟运行一次 npm start

      This project 有一个 package.json 用法示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 2014-03-29
        相关资源
        最近更新 更多