Nodejs-Agenda简单的例子
想必大家在开发的日常都会遇到定时任务的场景,比如我写了一个脚本,每天早上向我发送一封今日天气预报的邮件。如果只是一个脚本的话,那么非常简单,我们只需要用Linux中的crontab就可以解决了。
但大多数开发的时候用到的定时任务都是一次非常多个,比如上线了一个项目,每个用户都能设置一个推送时间用于推送某些东西。这时候随着用户的增多,是不可能把每一个定时任务都写进crontab中的。那么我们应该怎么解决呢。这时候就可以用到定时任务的模块。
Nodejs中常见的定时任务模块有 node-schedule
、agenda
、bull
和 bee
。而我们今天要介绍的是agenda模块。
这个模块结合mongodb进行存储,开发者可以将定义的任务存进数据库中,每类任务都会有固定的字段。基本上都有的就是下次运行时间、失败的原因等等。
它主要的步骤就是定义任务,然后确定是以什么方式执行任务,分为now、schedule、every三种,那么我们就来看看怎么使用它吧。
首先先初始化
const Agenda = require("agenda");
/**
* @description 初始化参数配置
* @param mongo {Object} 可以通过驱动连接mongodb得到实例
*/
const CONNECTION_OPTIONS = {
db: {
address: 'mongodb://127.0.0.1:27017/agenda',
collection: 'agendaJobs',
options: {
auto_reconnect: true,
poolSize: 10,
useNewUrlParser: true,
useUnifiedTopology: true
// mongo: myMongoClient
}
},
name: 'AGENDA FOR EXAM PUSH',
defaultConcurrency: 5,
maxConcurrency: 100,
defaultLockLifetime: 10000
}
// 初始化agenda
const agenda = new Agenda(CONNECTION_OPTIONS);
接着是定义任务并设置执行方式
// 为了不让任务重现重复,所以定义的时候我们给他一个特定的符号标识,比如用户名或者账号
/**
* @param job {Object} 任务对象 里面有关于任务的许多信息,也能依靠job.attrs.data得到我们定义时传的数据
*/
async function setTask() {
try {
let taskName;
agenda.define(`${username} ${taskName}`, { priority: 'high', concurrency: 100, lockLifetime: 10000 }, async (job, done) => {
// 任务逻辑处理
try {
...
done();
} catch (error) {
throw new Error(error);
}
});
let date;
agenda.schedule(`${date}`, `${username} ${taskName}`, { data });
agenda.start();
}
} catch (error) {
console.dir(error);
}
}
它也有一系列的监听函数,比如start、complete、success等等,如果有什么逻辑需要实现的话,也可以用这些函数,不过相信大多时候都不需要
更多细节可以翻阅作者仓库Lightweight job scheduling for Node.js