每五分钟安排一次 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 分钟会怎样?它会被解雇不止一次吗? withsetInterval()
是(如果它是异步的,否则它会阻塞一切),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 插页式广告
如何在 Windows 命令提示符下每 5 分钟安排一次任务?