Appearance
定时任务
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 语法格式:
| 秒 | 分 | 小时 | 日期 | 月份 | 星期 | 年份 | |
|---|---|---|---|---|---|---|---|
| 格式 1 | Seconds | Minutes | Hours | DayofMonth | Month | DayofWeek | Year |
| 格式 2 | Seconds | Minutes | Hours | DayofMonth | Month | DayofWeek |
字段含义 :
| 字段 | 允许值 | 允许特殊符号 |
|---|---|---|
| 秒(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 个)。如果指定日期不存在,则不会触发。 |
| L | L 只能用在日期(DayofMonth)和星期(DayofWeek)两个域。是单词 Last 的缩写。 在日期(DayofMonth)域中,L 表示一个月的最后一天,即 1 月 31 号,4 月 30 号等。如果 L 前有数字,例如:6L,表示这个月倒数第 6 天。在星期(DayofWeek)域中,L 表示星期的最后一天,即 7 或者 SAT(星期六)。如果 L 前有数字,例如:FRIL,表示这个月的最后一个星期五。 |
| W | W 只能用在日期(DayofMonth)域。表示指定日期最近的工作日。例如:15W,如果 15 号是周六,则任务在 14 号(星期五)触发。如果 15 号是周日,则任务在 16 号(星期一)触发。如果 15 号是工作日(星期一到星期五),则任务 15 号(工作日当天)触发。注意:W 不能跨月,如果 1 号是星期六,任务则会在下个星期一(3 号)触发。W 只能配合单独数字使用,不能是范围或列表 。 |
| LW | 表示每个月的最后一个工作日。 |
| C | C 只能用在日期(DayofMonth)和星期(DayofWeek)两个域。是单词 Calendar 的缩写,表示计划所关联的日期。在日期(DayofMonth)域中,5C 表示 5 日后的第一天,即 6 号。在星期(DayofWeek)域中,1C 表示星期日后的第一天 ,即星期一。 |
最后放大招了,在线生成器 点我点我啊