节点JS议程调度程序 – 缺less计划任务

我使用议程插件作为调度(与快递一起)

这是我的代码

var express = require('express'); var Agenda = require('agenda'); var agenda = new Agenda({db: { address: 'localhost:27017/express'}}); var app= express(); app.get('/notify', function(req,res){ res.type('text/plain'); var message = req.param('message'); agenda.now('send reminder', {data:message}); res.send(message); }); agenda.define('send reminder', function(job,done){ console.log(job.attrs.data.data); }); agenda.start(); app.listen(80); 

这是我们面临的问题

  • 并非所有的信息都被打印出来
  • 有时消息不止一次打印。
  • 10个电话(约)后,调度程序永远停止
  • 调用预定时间至less有2秒的延迟

有些灯会是令人满意的

我用下面的议程来做一个testing

 var agenda = new Agenda(); agenda.database(config.db.host + ':' + config.db.port + '/' + config.db.name, 'jobs') var i = 0; agenda.define('some job', function(job) { i++; console.log( i+ " Run at " + new Date().getMinutes() + ":" + new Date().getSeconds()); }); agenda.every('10 seconds', 'some job'); agenda.start(); 

输出如下 –

1 56:59运行

2 57:13运行

3 57:28运行

4在57:43运行

5在57:58运行

6在58:13运行

等等…

我离开了工作3小时,我仍然看到它运行。 我没有看到你的前三个观察。 我看到每次运行延迟~5秒钟,你可以看到第二次打印。 这可能是由于远程数据库造成的mongo延迟和/或由于日志打印延迟造成的。 我之前使用过议程,如果您需要以秒为单位执行您的工作,我认为您不应该使用它。

顺便说一句,为什么你会使用调度程序来处理一个现在的事件,当你需要login的时候你不会只使用console.log()吗? 如果你需要做别的asynchronous,是不是一个简单的调用。

在我的代码中的问题是,我忘了调用done()方法

它应该是

 agenda.define('send reminder', function(job,done){ console.log(job.attrs.data.data); done(); }); 

要么

 agenda.define('send reminder', function(job){ console.log(job.attrs.data.data); });