Skip to content
目录

定时任务

1、编写定时任务

可以在 app/schedule 目录下创建一个 update_cache.js 文件。

js
const Subscription = require('egg').Subscription;
class UpdateCache extends Subscription {
  // 通过 schedule 属性来设置定时任务的执行间隔等配置
  static get schedule() {
    return {
      interval: '1m', // 1 分钟间隔
      type: 'all', // 指定所有的 worker 都需要执行
    };
  }

  // subscribe 是真正定时任务执行时被运行的函数
  async subscribe() {
    const res = await this.ctx.curl('http://www.api.com/cache', {
      dataType: 'json',
    });
    this.ctx.app.cache = res.data;
  }
}

module.exports = UpdateCache;

也可以简写

js
module.exports = {
  schedule: {
    interval: '1m', // 1 分钟间隔
    type: 'all', // 指定所有的 worker 都需要执行
  },
  async task(ctx) {
    const res = await ctx.curl('http://www.api.com/cache', {
      dataType: 'json',
    });
    ctx.app.cache = res.data;
  },
};

2、定时任务类型

1、interval 类型

js
schedule: {
    // 每 10 秒执行一次
    interval: '10s',
  },

schedule.interval 参数来配置定时任务的执行时机,定时任务将会每间隔指定的时间执行一次.

  • 数字类型,单位为毫秒数,例如 5000。
  • 字符类型,会通过 ms 转换成毫秒数,例如 5s。

2、cron 类型

通过 schedule.cron 参数来配置定时任务的执行时机. cron 表达式通过 cron-parser 进行解析。

js
*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    |
│    │    │    │    │    └ day of week (0 - 7) (0 or 7 is Sun)
│    │    │    │    └───── month (1 - 12)
│    │    │    └────────── day of month (1 - 31)
│    │    └─────────────── hour (0 - 23)
│    └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, optional)

示例:
每 10 秒执行: _/10 _ * * * _
每周一 10 点执行: 0 0 10 ? _ 1
每月 1 号 10 点执行: 0 0 10 1 * ?
示例:

cron 表达式含义
_/5 _ * * * ?每隔 5 秒触发一次
0 _/1 _ * * ?每隔 1 分钟触发一次
0 0-5 14 * * ?下午 2:00 到 2:05 期间每隔 1 分钟触发一次
0 0 10,14,16 * * ?每天上午 10 点,下午 2 点,下午 4 点整触发一次
0 15 10 L * ?每个月最后一天上午 10:15 触发一次
0 15 10 LW * ?每个月最后一个工作日上午 10:15 触发一次

cron 语法格式:

小时日期月份星期年份
格式 1SecondsMinutesHoursDayofMonthMonthDayofWeekYear
格式 2SecondsMinutesHoursDayofMonthMonthDayofWeek

字段含义 :

字段允许值允许特殊符号
秒(Seconds)0 ~ 59, - * /
分(Minutes)0 ~ 59, - * /
小时(Hours)0 ~ 23, - * /
日期(DayofMonth)1 ~ 31,但需考虑当月实际天数, - * ? / L W C
月份(Month)1 ~ 12 或 JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC, - * /
星期(DayofWeek)1 ~ 7 或 SUN, MON, TUE, WED, THU, FRI, SAT (1 = SUN), - * ? / L C #
年(Year,可选)1970 ~ 2099, - * /

特殊符号:

特殊符号说明
*匹配该域的任意值,例如:Seconds 域表示每秒种,Minutes 域表示每分钟等 。
??只能用在日期(DayofMonth)和星期(DayofWeek)两个域。表示"非明确的值",当表达式中一个指定值之后,为避免冲突,将另外一个互斥设为?。例如:想在每个月 1 号触发调度,不管 1 号是星期几,则只能使用如下:0 0 0 1 _ ?,其中最后一位只能使用?,不是使用_。
-表示范围,例如:Minutes 域使用 5-20,表示从第 5 分钟到第 20 分钟,每分钟触发一次 。
/表示增量,每隔增量的时间出发一次,例如:Minutes 域使用 5/20,表示从第 5 分钟开始,每隔 20 分钟触发一次,即 5,25,45 分别触发一次。
,表示枚举值,例如:Minutes 域使用 5,20,表示在第 5 分钟和第 20 分钟分别触发一次。
##只能用在星期(DayofWeek)域。表示这个月第几个星期几。例如:6#3 or FRI#3,表示这个月的第 3 个星期五(6:周五,3:第 3 个)。如果指定日期不存在,则不会触发。
LL 只能用在日期(DayofMonth)和星期(DayofWeek)两个域。是单词 Last 的缩写。 在日期(DayofMonth)域中,L 表示一个月的最后一天,即 1 月 31 号,4 月 30 号等。如果 L 前有数字,例如:6L,表示这个月倒数第 6 天。在星期(DayofWeek)域中,L 表示星期的最后一天,即 7 或者 SAT(星期六)。如果 L 前有数字,例如:FRIL,表示这个月的最后一个星期五。
WW 只能用在日期(DayofMonth)域。表示指定日期最近的工作日。例如:15W,如果 15 号是周六,则任务在 14 号(星期五)触发。如果 15 号是周日,则任务在 16 号(星期一)触发。如果 15 号是工作日(星期一到星期五),则任务 15 号(工作日当天)触发。注意:W 不能跨月,如果 1 号是星期六,任务则会在下个星期一(3 号)触发。W 只能配合单独数字使用,不能是范围或列表 。
LW表示每个月的最后一个工作日。
CC 只能用在日期(DayofMonth)和星期(DayofWeek)两个域。是单词 Calendar 的缩写,表示计划所关联的日期。在日期(DayofMonth)域中,5C 表示 5 日后的第一天,即 6 号。在星期(DayofWeek)域中,1C 表示星期日后的第一天 ,即星期一。

最后放大招了,在线生成器 点我点我啊