在 node 的一些小型项目中我们可以使用 Agenda 模块来完成定时任务。从个人角度上来说并不建议使用 node完成定时任务,毕竟 node 擅长的是 IO 而不是 CPU 计算。 与其他定时任务比较, Agenda 有着最小的开销以及持久化的优势。即便程序重启了,也不会丢失现有任务。 Agenda 简介 Agenda 是基于 node 的一个轻量级任务调度类库,它的优势在于轻量级、持久化、使用简单。 1) 持久化 Agenda 引入mongodb从而实现持久化 。Agenda 将所有的任务(job)存储到mongodb中,对于使用mongodb做数据库的项目有天然优势。 2) 结构 在 Agenda 启动时会将预定义好的 processors 遍历一遍,从mongodb中查询出符合条件 job(这里的 job 可能不止一条)。对于遍历查询出来的job:如果时间已到或者已经是过去时间,那么立即执行;如果时间还未到,开奖,那么就延迟执行。 3)API Agenda 之所以受欢迎,与其简单灵活的 API 是分不开的。 Agenda 使用步骤 使用简单是 Agenda 一大优势,只需短短的几行代码便可使任务按照既定的计划运行。 1、 实例化 Agenda 实例的创建,在创建过程中主要做了: 连接mongo数据库 初始化内部变量 2、 定义 processor processor 指的是:在 job 按照需求到达指定的执行时间点时,需要执行的操作,也就是实际的业务逻辑。这部分逻辑是保存在内存中的,一但程序挂掉processor 也会丢失。 所以最好在程序启动的时候定义 processor,这样下次重启程序,processor 会被重新保存到内存当中。 定义一个定时更新用户信息的 job,define 方法有三个参数: 1)name 表示任务的名称,任务不可以与已有任务重名,否则会覆盖已有任务 2)options 表示设置任务属性: concurrency: 表示并发数,可运行任务的最大数量 lockLimit:任务被锁住的最大数量(Agenda 在运行一个任务时,会将当前任务锁住,以以防止重复执行任务) lockLifetime:任务被锁住的时间,如果 done() 调用,任务将自动解锁。 priority:任务执行的优先级(分为lowest、low、normal、high、highest、number) 以上代码就对其并发量 concurrency 做了限制,设置同时可运行任务数为5。 3)processor 第三个参数(processor)即回调函数中实现我们的处理逻辑。回调函数有两个参数,job 表示当前执行的任务信息,而回调函数的第二个参数 done 是可选的: done 的使用还是需要根据实际情况而定。例如这段代码中,我们省略了 options 参数,这时 Agenda 内部就会使用默认参数。我们省略了回调函数中的 done,这就意味着我们在回调函数中的逻辑可以使用异步调用。 3、 创建定义任务 处理逻辑定义完成之后,我们需要进行定义任务,规定任务的执行时间、周期等。对于任务的定义,Agenda 为我们准备了以下4个方法: every指定的任务每隔一个固定的时间执行一次 schedule计划任务,此方法跟 Linux 的计划任务几乎一致 now立即执行任务 create创建一个任务 1)every 根据业务的需求,如果某些任务需要在项目整个生命周期一致运行的的时候,我们可以使用 every 方法。例如,在一定间隔时间抓取天气情况。 (每隔5分钟获取一次天气) 2)schedule 定时周期性任务很常见,主要作用是将任务计划在指定时间运行一次: (明天早上七点获取天气) 3)now 立即执行任务: (马上获取天气) 4、 思考与探索 (责任编辑:本港台直播) |