Nodejs-Agenda简单的例子

想必大家在开发的日常都会遇到定时任务的场景,比如我写了一个脚本,每天早上向我发送一封今日天气预报的邮件。如果只是一个脚本的话,那么非常简单,我们只需要用Linux中的crontab就可以解决了。

但大多数开发的时候用到的定时任务都是一次非常多个,比如上线了一个项目,每个用户都能设置一个推送时间用于推送某些东西。这时候随着用户的增多,是不可能把每一个定时任务都写进crontab中的。那么我们应该怎么解决呢。这时候就可以用到定时任务的模块。

Nodejs中常见的定时任务模块有 node-scheduleagendabullbee。而我们今天要介绍的是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(time) {
    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