简介
ows-agenda-2是一个基于Node.js的轻量级调度工具,它可以在指定的时间以及间隔周期性地调用Node.js任务。它可以被应用于计划任务,网站爬虫,和一些与时间相关的业务需求上。ows-agenda-2具有灵活的配置,支持多种不同的数据存储方式。本文将介绍如何使用npm包ows-agenda-2,并提供使用案例。
安装
首先,在你的项目目录下使用npm安装ows-agenda-2:
npm install ows-agenda-2 --save
快速入门
下面的代码片段演示了如何使用ows-agenda-2:
-- -------------------- ---- ------- ----- ------ - ------------------------ ----- ------ - --- -------- --- - -------- ------------------------------------- ----------- ------- -------- - ---------------- ---- -- - --- ---------------------- ----- ----- -- - ------------------- -------------------------- ------- --- ------ ---------- - ----- --------------- --------------- --------- -------- - ----- ------ --- -- ---------- ---- --- --------- ---- --- --- ---- -- ---- -- -- ----- --------- ------- ---- -- -------- ----- --- --------------- -- ------------------- -------- ----- -------------- --------------------------
在上面的例子中,我们创建了一个Agenda实例,并在其中定义了一个任务,它将在每3秒中输出一条问候语。在任务执行时,它将从job.attrs.data中读取数据,并用它来定制问候语。在实例化后,我们通过调用every()方法来安排任务。最后,我们在异步函数中等待15秒,然后停止任务调度。
API
Agenda的API主要包含以下几个部分:
Agenda
Agenda是整个调度系统的入口及控制中心。它提供了根据不同用例应该关心的数据存储及存储策略,定义任务,调度任务等的方法。建议一个进程只创建一个Agenda。
Agenda构造函数
我们可以通过以下方式来创建一个Agenda实例:
const Agenda = require('ows-agenda-2'); const agenda = new Agenda(options);
其中,options
是选项对象,可以包含以下属性:
db
: 用来配置数据存储及存储策略。name
: 用来命名和记录不同Agenda实例,非必需。processEvery
: 用来配置Agenda在多长时间后检查任务是否应该执行。defaultConcurrency
: 用于配置默认的任务并发度。maxConcurrency
: 用于配置最大的任务并发度。defaultLockLifetime
: 用于配置默认的任务锁定时间。
Agenda#every(interval, name[, data][, options])
every()
方法安排将任务间隔在一定时间内运行。参数解释如下:
interval
: 字符串,指定任务执行的间隔。name
: 字符串,指定任务名称。data
: 指定了任务需要的数据 意味着你可以通过这种方式在你的任务处理器中读取数据。options
: 选项对象。
agenda.every('3 seconds', 'greet', { name: 'John' }); // With options agenda.every('*/5 * * * * *', 'cleanup', {}, { timezone: 'America/New_York' });
interval
和name
是必需的。data
和options
是可选的。interval
的格式遵循cron/time
的格式.
options
选项可以包含以下字段:
timezone
: 如果没有指定则采用服务器默认时区。deadline
: 如果一个任务没有在指定时间内完成,就会超时(默认5000ms).
Agenda#define(name[, options], processor)
define()
方法将在Agenda实例上定义一个新任务。参数解释如下:
name
: 字符串,指定任务名称。options
: 选项对象,在这个任务上配置concurrency和其他参数。非必填。如果没有指定,任务将使用默认配置。processor
: 函数,接受job和done作为参数。job包含任务本身相关的基本信息,done则是一个回调函数,表示任务完成。
-- -------------------- ---- ------- ---------------------- ----- ----- -- - ------------------- -------------------------- ------- --- -- ---- ------- ------------------------ - --------- ------- -- ----- --- -- ----------------------------------
Job
Job是一个调度中的任务,并包含有关该任务的所有信息。
agenda
: 此属性是使用此作业的Agenda实例的引用。name
: 此属性是指定已定义参数传递给every()、schedule()或now()方法的作业名称。type
: 此属性是任务类型。types = ['normal', 'single', 'fixed']data
: 此属性是当任务处理程序运行时传递给它的参数。repeatInterval
: 属性是与cron语法匹配的字符串,用于定义在处理此任务之间调度任务的频率。repeatTimezone
: 属性是时区字符串,用于在处理完任务后调度重复任务。nextRunAt
: 属性是下一个运行时间,在第一次调度时赋值。lockedAt
: 属性是上锁时间,在加锁后赋值。lastModifiedBy
: 属性是jobs上次修改的函数名
Job#repeatAt(time)
repeatAt()
可以使用Date对象或类似'HH:MM:ss'的字符串指定时间。改变下一次任务触发的时间点,并使用当前任务设置添加进入延迟队列。
const today = new Date(); const tomorrow = new Date(today.setDate(today.getDate() + 1)); const job = await agenda.schedule(tomorrow, 'greet', { name: 'Michelle' }); job.repeatAt('3:30am').save();
Job#save()
save()
方法将改变的Job信息存入数据库。
Job#schedule(time)
schedule()
方法安排一个任务在将来的某个时间运行。参数time可以是Date对象或者是字符串。这个方法返回一个promise,处理解决后返回Job实例。
const today = new Date(); const tomorrow = new Date(today.setDate(today.getDate() + 1)); const job = await agenda.schedule(tomorrow, 'greet', { name: 'Michelle' });
Job#run()
run()
方法使作业开始立即运行。在 run() 方法内部调用 job processing 回调( job processor) ,执行完成后调用 done。此方法返回一个Promise,它将在调用回调完成后解决。
const job = await agenda.now('greet', { name: 'John' }); await job.run();
Job#remove()
remove()
方法从数据库中删除一个任务。
const job = await agenda.create('greet', { name: 'John' }); await job.remove();
数据存储
默认情况下,Agenda将使用MongoDB作为数据存储,并使用mongo-driver来与MongoDB通信。
Agenda({ db: { address: 'mongodb://127.0.0.1/agenda-example', collection: 'jobs', options: { useNewUrlParser: true }, }, });
示例
下面我们通过一个爬取TopStories的案例来演示ows-agenda-2的使用。
- 首先,安装依赖:
npm install axios cheerio ows-agenda-2
- 以下是完整的代码:
-- -------------------- ---- ------- -- ---- ----- ------ - ------------------------ ----- ----- - ----------------- ----- ------- - ------------------- -- -------------------- ----- ------ - --- -------- --- - -------- ------------------------------------ -- --- -- ---- -------------------- --- --------- ----- ----- ----- -- - --- - ----- - ----- ---- - - ----- ------------------------------------------- ----- - - ------------------- ----------------------- --- -- - ----- ---- - ------------- ----- ----- - -------------------- -------------------- ----------- --- ------- - ----- ----- - ---------- - --- -- ------- ------ ---------- - ----- --------------- ---------------- --------- ------ --- ---------- -- ---------- ---- --- --------- ---- --- --- ---- -- ---- -- -- ----- --------- ------- ---- -- -------- ----- --- --------------- -- ------------------- --------- ----- -------------- --------------------------
在上面的案例中,我们首先通过axios
模块发送一个GET请求来获取Hacker News网站上的Top Stories。使用cheerio
模块分析数据,然后输出排名和标题。最后,我们使用agenda.every()
方法调度任务,它将在每10秒中运行一次。
结尾
这篇文章中,我们讲解了如何使用npm包ows-agenda-2。作为一个基于Node.js的轻量级调度工具,它可以帮助我们在指定的时间,周期性地调用我们的Node.js任务。我们学习了如何安装、初始化和使用ows-agenda-2的API以及数据存储,以及一个完整的演示案例。我希望这篇文章可以帮助你入门ows-agenda-2并开始使用它。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600672673660cf7123b36559