Agenda是类似Quarzt的轻量级持久化任务调度框架, 数据存储再mongodb上, 部署与学习十分简单.
第三方开发者还为Agenda提供了一个简易的UI界面 Agenda UI. 提供简单的可视化界面.

Base

Agenda 将任务对象保存再mongo里面, 任务对象包含任务的name, 附带数据, 定时规则等.
我们可以动态对任务进行CRUD操作. Agenda提供对应API.

虽然Agenda本身提供的对Job的操作比较简单, 但因为Agenda的Job都是存储再mongo之中,所以我们可以通过直接操作monogo实现的Job的更新与删除.

Start

简单的添加任务操作:

1
2
3
4
5
var job = agenda.create('testJob', {key: "value"});
job.repeatEvery('5 seconds');
job.save(function(err) {
console.log("Job successfully saved");
});

程序开始时,我们需要创建agenda对象,指定事件响应函数,并开始执行任务调用.

1
2
3
4
5
var agenda = new Agenda({db: { address: 'localhost:27017/agenda-example'});
agenda.define('testJob', function(job) {
console.log("Job execute, now is " + new Date() + " Data=" + JSON.stringify(job.attrs.data));
});
agenda.run();

数据存储

Agenda使用mongodb。

1
2
3
4
5
// 指定使用的mongodb,默认使用agendaJobs集合
var agenda = new Agenda({db: { address: 'localhost:27017/agenda-example'}});

// 如果需要指定其他集合
var agenda = new Agenda({db: { address: 'localhost:27017/agenda-test', collection: 'agendaJobs' }});

指定循环规制

1
2
3
4
5
// 直接构造的agenda对象的时候指定
var agenda = new Agenda({processEvery: '1 minute'});
// 1分钟循环一次
agenda.processEvery('1 minute');

指定任务最大并发数

1
2
3
4
// 构造时指定
var agenda = new Agenda({maxConcurrency: 20});
// 直接指定
agenda.maxConcurrency(20);

指定默认并发数

1
2
3
4
// 构造时指定
agenda.defaultConcurrency(5);
// 直接指定
var agenda = new Agenda({defaultConcurrency: 5});

设置任务最大响应时间

指定任务从开始执行到调用finish的时间(指调用done函数),这能有效的解决任务奔溃或者超时

1
2
3
4
// 构造时指定
var agenda = new Agenda({defaultLockLifetime: 10000});
// 直接指定
agenda.defaultLockLifetime(10000);

定义任务处理器

定义任务行为

当执行的任务为异步方法的时候,需要再方法最后调用done()
如果为同步方法,则省略声明done

影响任务行为的参数:

  • concurrency 指定最大任务并发数
  • lockLifetime 锁生存时间,指定异步调用时最长等待时间
  • priority 优先级(lowest|low|normal|high|highest|number)
1
2
3
4
5
6
7
8
9
10
11
// 执行任务为异步方法
agenda.define('job_name', function(job, done) {
doSomething(function() {
done();
});
});

// 执行任务为同步方法
agenda.define('say hello', function(job) {
console.log("Hello!");
});

定时任务

指定任务重复的规制,支持数字, cron表达式, 甚至如10 minutes等可读性较高的表达式

1
2
job.repeatEvery('10 minutes');
job.repeatEvery('*/10 * * * * * *');

指定特定的重复时间

1
2
// 每天15:30
job.repeatAt('3:30pm');

指定只执行一次的的任务

1
job.schedule('3:30pm');

now
马上执行某事件

1
agenda.now('do the hokey pokey');