节点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); });