2024-08-24 • 5.0.0
Node.js 的轻量级作业调度库。
<!-- 以下是基于 Koa 的案列 -->
const Agenda = require('agenda')
const agenda = new Agenda()
const dayjs = require('dayjs')
const mongoose = require('mongoose')
// 连接到数据库
const mongoConnectionString = 'mongodb://127.0.0.1:27017/test'
agenda.database(mongoConnectionString, 'agendaJobs').processEvery('10 seconds')
agenda.on('ready', function () {
agenda.start()
})
// 定义发送邮件任务
agenda.define('sendEmail', async job => {
const { to, subject, info } = job.attrs.data
try {
// 这里自定义的发送邮件的方法
await sendEmail({ to, subject, info })
await job.remove()
} catch (err) {
job.fail(err.stack)
await job.save()
}
})
async function createAgenda(data) {
/*
可以自定义 data 数据内容,这里只做一个示例
let { to, subject, info, time, key } = data
time 为任务执行的时间
*/
let { time } = data
await agenda.schedule(dayjs(time).toDate(), 'sendEmail', data)
}
async function findAgenda({ key }) {
const jobs = await agenda.jobs({ name: 'sendEmail', 'data.key': key }, { nextRunAt: -1 })
return jobs
}
async function removeAgenda({ _id }) {
const numRemoved = await agenda.cancel({ name: 'sendEmail', _id: mongoose.Types.ObjectId.createFromHexString(_id) })
return numRemoved
}
module.exports = { createAgenda, findAgenda, removeAgenda }