每五分钟安排一次 Node.js 作业

Posted

技术标签:

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

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

什么是最好的解决方案?

谢谢

【问题讨论】:

你为什么要使用延时。 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 用法示例。

【讨论】:

以上是关于每五分钟安排一次 Node.js 作业的主要内容,如果未能解决你的问题,请参考以下文章

我想在 ios(swift) 中每五分钟加载一次 facebook 插页式广告

请问在linux系统下如何每五分钟自动执行一次页面

如何在 Windows 命令提示符下每 5 分钟安排一次任务?

xxljob在使用过程中(每五分钟执行一次)前期正常,中间出现过一次卡住的情况,定时任务从某个时间

oracle job 时间每五分钟执行怎么写

js每隔五分钟执行一个函数