使用计时器而不是计划的Cron作业在Node.js中计划任务

时间:2017-06-16 08:48:06

标签: node.js timer cron

这是我的目标:

  

最后一次文档更新后5分钟,我想执行一次性任务

所以这就是行动的流程:

  1. 用户更新文档 - 启动计时器并从5分钟开始倒计时
  2. 如果用户再次更新同一文档并且上一个计时器(由document._id标识)仍在运行,请将该计时器重置为5分钟并重复倒计时
  3. 当计时器已经过去时 - 执行一次性任务
  4. 我之前没有做过这样的事情,我不知道该从哪里开始。

    我可以使用Mongoose中可用的方法轻松地挂接文档更改(例如,在保存时,执行func以设置或重置计时器)

    然而,我无法想办法:

    • 创建一个等待5分钟的计时器 - 然后执行任务
    • 使计时器可访问,以便我可以重置计时器
    • 使计时器可访问,因此我可以添加额外的变量,这些变量将在计时器结束时用于功能

    我已经调查了Cron的工作,但他们似乎每天都在同一时间安排任务。

    我需要一个延迟任务的计时器,还需要重置该计时器的能力,并为计时器添加额外的数据。

    任何提示都表示赞赏。

3 个答案:

答案 0 :(得分:1)

这是我设法完成的解决方案。

首先,值得注意的是我的原始假设是正确的:

  

Cron工作非常适合每天同时安排的重复性任务。但是,对于即时创建并具有倒计时元素的任务,cron jobs不是正确的工具。

但是,请输入node-schedule(https://www.npmjs.com/package/node-schedule

  

节点计划是Node.js的类似cron,而不是cron的灵活作业调度程序。它允许您使用可选的重复规则来安排在特定日期执行的作业(任意函数)。 它在任何给定时间只使用一个计时器(而不是每秒/分钟重新评估即将到来的作业)

定时器的使用正是这些即时任务所需要的。

所以我的解决方案如下:

// node_modules/email-scheduler/index.js

module.exports = {};

我的想法(虽然尚未经过测试)是我可以通过创建节点模块为email_scheduler对象创建类似单身的实例。像这样:

> git checkout local-branch
> git branch --unset-upstream
> git push -u origin remote-branch

这样,我可以访问scheduleJobs并重置节点应用程序的每个文件中的计时器。

答案 1 :(得分:0)

您可以使用事件。使用某个参数调用事件,然后在任务添加睡眠并执行任务之前。但是在nodejs中添加sleep或settimeout不是一个好主意。

答案 2 :(得分:0)

我遇到了同样的难题,但我最终决定使用 javascript 本机函数。

function intervalFunc() {
  //inside this function you can request to get the date and time then decide what to do and how to do it
  autogens.serverAutoGenerate();//my function to autogenerate bills
}

setInterval(intervalFunc, 1000);//repeat task after one seconds

在你的node js应用的index文件或入口文件中添加代码会使函数重复执行。您可以根据需要选择更改频率。如果您想每天运行 3 次 cronjob,请获取 24 小时内的秒数,然后除以 3。如果您想在特定时间运行该作业,请使用 new Date(),您可以检查确定现在是否适合执行您的活动。