使用Node.js的Node-cron进行任务调度 - Dilina


在使用 Node.js 构建 Web 应用程序和 API 时,我们有时会遇到需要重复执行的任务,例如电子邮件通知、文件下载和数据库备份等。 这可能是每天、每月甚至每年的特定时间,具体取决于在任务上。
Node-schedule是 Node.js 最流行的灵活的类似 cron 的任务调度库。两者很类似,是基于时间的时间表,而不是基于间隔的时间表和它被设计为在进程的调度。进程内调度意味着“调度作业只会在您的脚本运行时触发,并且在执行完成时调度将消失”。
如果您需要安排即使在您的脚本未运行时也会持续存在的作业,请考虑使用实际的 Node-cron。

 
Node-cron 简介
Node-cron是一个npm 包,它是用纯 JavaScript为node编写的,它基于GNU crontab语法。因此,第一步是基于学习node-cron和cron-syntaxes。

Node-cron 语法
cron 的操作由crontab(cron 表)文件驱动,这是一个包含 cron 守护程序指令的配置文件。Cron 守护进程是在内存中运行的系统管理可执行文件,可用于调度任务。
 
以下作业计划在每小时的每 2 分钟运行一次。

import * as cron from 'node-cron'

cron.schedule('* 2 * * * *', () => {
  console.log('execute task every hour at the 2nd minute');
});

上述*的地方意味着“每一秒、每一小时、每一天、每一个月和一周中的每一天”。
下面的另一个例子显示了每天早上 5.30 运行的 cron 作业,

cron.schedule('30 5 * * *', () => {
  console.log('execute task every day at 5:30 am');
});

如果我们想安排在一年中每个季度的第一天执行的作业,我们可以按如下方式进行。
cron.schedule('0 0 1 */3 *', () => {
  console.log('execute task every quater on the first day of the month');
});

在这里你可以看到,我们使用了一个特殊的字符 (/),而不是通常的星号。就这样,cron 作业调度中引入了一些特殊字符,我们可以将它们表示如下。
  • 逗号:逗号可用于分隔少数几个值。例如,每 2 分钟和 5 分钟,我们可以将其表示为 2,5。
  • 连字符:连字符 (-) 用于提供值的范围,例如 Monday-Friday。
  • 斜线:斜线用于提供步进值,例如每 5 秒,我们可以将其表示为 */5。

下面显示了另一个示例,它可以安排作业在每周一到周五(仅限工作日)下午 4 点执行:
cron.schedule('0 16 * * 1-5', () => {
  console.log('running a task every weekday at 4:00 pm');
});

另一个例子显示了在早上 5 点到早上 7 点之间每 15 分钟执行一次的作业。
cron.schedule('*/15 5-7 * * *', () => {
  console.log('execute task every 15 minutes between 5 a.m. and 7 a.m.');
});

 
作业调度中使用的方法
启动计划:在初始化时,如果将 cron 选项设置为 False,那么即使到达计划时间,计划作业也不会执行。如果您需要启动该作业,则需要调用如下所示的start方法。

const cron = require('node-cron');

import * as cron from 'node-cron'
const job = cron.schedule('*/5 5-7 * * *', () => {
  console.log('execute task every 15 minutes between 5 a.m. and 7 a.m.');
});
job.start();

停止调度:如果您需要停止正在执行的任何调度,您应该使用stop方法。即使重新启动,计划也不会执行。
const cron = require('node-cron');

import * as cron from 'node-cron'
const job = cron.schedule('*/5 5-7 * * *', () => {
  console.log('execute task every 15 minutes between 5 a.m. and 7 a.m.');
});
job.stop();

销毁时间表:您可以使用destroy方法永久销毁时间表。

const cron = require('node-cron');

import * as cron from 'node-cron'
const job = cron.schedule('*/5 5-7 * * *', () => {
  console.log('execute task every 15 minutes between 5 a.m. and 7 a.m.');
});
job.destroy();