简介
@sirena/agenda
是一个基于 Node.js 的任务调度库,可以用于实现计划任务、定时任务等常见的任务调度需求。它支持多种存储方式,包括 MongoDB、Redis 等。使用 @sirena/agenda
可以帮助前端开发人员快速地实现任务调度功能,提高开发效率。
安装
使用 npm
安装 @sirena/agenda
:
npm install @sirena/agenda --save
在代码中引入 @sirena/agenda
:
const Agenda = require('@sirena/agenda');
快速开始
创建 Agenda 实例
创建 Agenda
实例之前需要先连接用于存储任务信息的数据库。以 MongoDB 为例,可以使用 mongoose
库进行连接:
-- -------------------- ---- ------- ----- -------- - -------------------- ---------------------------------------------- - ---------------- ---- --- ----- -- - -------------------- -------------- --------------------------- -------- --------- --------------- -- -- - -------------------- -------- ---
连接成功之后,可以创建 Agenda
实例,一个 Agenda
实例对应一个任务调度实例:
const agenda = new Agenda({ db: { address: 'mongodb://localhost/agenda' } });
定义任务
使用 agenda.define
方法定义一个任务:
agenda.define('send email', (job, done) => { console.log(`sending email to ${job.attrs.data.to}...`); done(); });
上述代码定义了一个名为 send email
的任务,任务执行时会输出一句日志,并调用传入的 done
回调函数。job
参数表示任务本身,可以通过 job.attrs.data
访问传递给任务的数据。例如,可以使用以下代码添加一个 send email
任务:
agenda.schedule('tomorrow at noon', 'send email', { to: 'foo@example.com' });
此处使用 schedule
方法指定任务执行时间。上述代码表示在明天中午时刻执行任务,任务执行时传入的数据为 { to: 'foo@example.com' }
。
启动 Agenda
创建 Agenda
实例并定义任务之后,需要调用 agenda.start
方法启动任务调度:
agenda.start();
这样就可以开始执行定时任务了。
持久化任务
默认情况下,@sirena/agenda
并不会将任务信息持久化到数据库。如果需要在任务调度服务重启之后恢复已经定义的任务,可以启用持久化功能。
将 Agenda
实例的 processEvery
属性设置为 5 秒,则 @sirena/agenda
会每 5 秒将任务信息同步到数据库:
const agenda = new Agenda({ db: { address: 'mongodb://localhost/agenda' }, processEvery: '5 seconds', });
在任务执行时更新任务状态
@sirena/agenda
会为任务定义一个名为 status
的属性,用于表示任务的状态。默认情况下,任务的状态为 'created'
,表示任务已经被创建但尚未被调度执行。任务执行时需要显式将任务状态更新为 'running'
,任务执行完成后再将任务状态更新为 'complete'
或 'failed'
:
agenda.define('send email', (job, done) => { job.attrs.status = 'running'; // 将任务状态更新为 'running' console.log(`sending email to ${job.attrs.data.to}...`); done(); job.attrs.status = 'complete'; // 将任务状态更新为 'complete' });
如果任务执行出错,则应将任务状态更新为 'failed'
:
-- -------------------- ---- ------- ------------------- ------- ----- ----- -- - ---------------- - ---------- -- -------- --------- -------------------- ----- -- -------------------------- --- - ----- --- ------------- -- ---- --------- - ----- ----- - -------------- -- -------- -------- ---------- - ---
监听任务状态变化事件
@sirena/agenda
提供了 Agenda#on
方法用于监听任务状态变化事件。例如,可以在任务失败时发送一封邮件通知管理员:
agenda.on('fail:send email', (err, job) => { console.log(`job failed with error: ${err.message}`); // send error email to admin... });
上述代码中,fail:send email
为事件类型,表示 "send email"
任务执行失败时触发该事件。在事件响应函数中,可以通过 job.attrs
访问任务信息。
使用 Agenda 的高级功能
@sirena/agenda
还提供了一些高级功能,例如重复任务、延迟执行任务、查询任务列表等。以下是一些使用示例:
重复任务
可以使用 Agenda#every
方法定义一个定时执行的任务。以下代码定义一个每分钟执行一次的任务:
agenda.every('1 minute', 'log time');
此处的 'log time'
为任务名,任务定义与之前的示例相同。
延迟执行任务
可以使用 Agenda#schedule
方法延迟执行一个任务。以下代码定义一个延迟 5 秒执行的任务:
agenda.schedule(new Date(Date.now() + 5000), 'log time');
查询任务列表
可以使用 Agenda#jobs
方法查询任务列表。以下代码查询数据库中所有状态为 'complete'
的任务:
agenda.jobs({ 'data.status': 'complete' }, (err, jobs) => { if (err) { return console.error(err); } console.log(`found ${jobs.length} completed jobs.`); });
上述代码中,第一个参数为查询条件,第二个参数为查询结果的回调函数。
总结
@sirena/agenda
是一个功能强大的任务调度库,可以帮助开发人员快速实现任务调度和计划任务的功能。本文介绍了 @sirena/agenda
的基本用法,包括创建 Agenda
实例、定义任务、启动任务调度服务、任务持久化等。同时,本文还介绍了 @sirena/agenda
的一些高级功能,例如重复任务、延迟执行任务、查询任务列表等。希望本文能对前端开发人员在使用 @sirena/agenda
时提供一些参考和指导。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005547581e8991b448d1bca