Nest 的 3 种定时任务

引入 ScheduleModule

新建项目:

bash 复制代码
nest new schedule-task -p npm

安装定时任务的包:

bash 复制代码
npm install @nestjs/schedule

在 AppModule 里引入:

使用 cron 表达式

创建 service:

bash 复制代码
nest g service task --flat --no-spec

通过 @Cron 声明任务执行时间:

CronExpression.EVERY_5_SECONDS 的值:

运行:

bash 复制代码
npm run start:dev

每 5s 会执行一次 handleCron 函数。

cron 表达式有这 7 个字段:

其中年是可选的,所以一般都是 6 个。

此外,Cron 表达式还支持一些特殊字符:

  • :代表所有可能的值。例如,在小时字段中, 表示"每个小时"。
  • ?:用于日期和星期字段。它表示不指定值。通常,日期和星期字段不会同时被指定值,因为它们是互斥的。所以,你可以使用 ? 来表示其中一个字段不指定值。
  • -:用于指定范围。例如,10-12 在小时字段中表示 10 点、11 点和 12 点。
  • ,:用于指定多个值。例如,在小时字段中,10,12,14 表示 10 点、12 点和 14 点。
  • /:用于指定步长。例如,0/15 在分钟字段中表示每 15 分钟。

所以 Nest 提供了一些 cron 表达式常量:

这个 @Cron 装饰器还有第二个参数,可以指定定时任务的名字,还有时区:

时区可以在这里查。

常用的 cron 表达式

  1. 每分钟执行一次
markdown 复制代码
* * * * *

这个表达式会在每分钟的每一秒执行任务。

  1. 每小时执行一次

    0 * * * *

这个表达式会在每小时的第 0 分钟执行任务。

  1. 每天执行一次

    0 0 * * *

这个表达式会在每天的午夜 00:00 执行任务。

  1. 每天特定时间执行

    0 8 * * *

这个表达式会在每天的上午 8:00 执行任务。

  1. 每周一次

    0 0 * * 1

这个表达式会在每周一的午夜 00:00 执行任务。

  1. 每月一次

    0 0 1 * *

这个表达式会在每月的第一天午夜 00:00 执行任务。

  1. 每年一次

    0 0 1 1 *

这个表达式会在每年的 1 月 1 日午夜 00:00 执行任务。

  1. 每小时的第 15 分钟执行

    0 15 * * * *

这个表达式会在每小时的第 15 分钟执行任务。

  1. 每天的上午 9 点到下午 5 点,每小时执行一次

    0 0 9-17 * * *

这个表达式会在每天的上午 9 点到下午 5 点之间,每小时的开始执行任务。

  1. 每周一至周五,每天上午 8 点执行

    0 0 8 * * 1-5

这个表达式会在每周的工作日(周一至周五)的上午 8:00 执行任务。

  1. 每月最后一天的午夜执行

    0 0 0 L * *

这个表达式会在每月的最后一天午夜 00:00 执行任务。请注意,L 是 Quartz Scheduler 的特殊字符,不是所有的 cron 实现都支持它。

  1. 每月第一个星期一的上午 8 点执行
bash 复制代码
0 0 8 ? * 2#1

这个表达式会在每月的第一个星期一的上午 8:00 执行任务。同样地,?# 是 Quartz Scheduler 的特殊字符。

注意:如果你使用的是标准的 Unix/Linux cron,请确保不要使用 Quartz Scheduler 的特殊字符。

@Interval 和 @Timeout

除了 @Cron 之外,可以用 @Interval 指定任务的执行间隔,参数是毫秒值:

用 @Timeout 指定多长时间后执行一次:

综上,我们可以通过 @Cron、@Interval、@Timeout 创建 3 种定时任务。

管理定时任务

我们可以对定时任务增删改查,注入 SchedulerRegistry:

然后在 onApplicationBootstrap 的声明周期里拿到所有的 cronJobs 打印下:



能拿到单个或者全部的定时任务。

后面我们要自己创建定时任务,需要 npm install cron 后。

SchedulerRegistry 提供了 api 让我们删除和添加这三种类型的定时任务。

相关推荐
sdgsdgdsgc19 小时前
Next.js企业级应用开发:SSR、ISR与性能监控方案
开发语言·前端·javascript
哲此一生98419 小时前
搭建Vue3工程(去除不必要的文件)
前端·javascript·vue.js
摇滚侠21 小时前
Spring Boot 3零基础教程,IOC容器中组件的注册,笔记08
spring boot·笔记·后端
黑云压城After1 天前
H5使用环信实现视频或语音通话
前端·javascript·vue.js
未来之窗软件服务1 天前
自己写算法(九)网页数字动画函数——东方仙盟化神期
前端·javascript·算法·仙盟创梦ide·东方仙盟·东方仙盟算法
程序员小凯1 天前
Spring Boot测试框架详解
java·spring boot·后端
你的人类朋友1 天前
什么是断言?
前端·后端·安全
FIN66681 天前
昂瑞微:实现精准突破,攻坚射频“卡脖子”难题
前端·人工智能·安全·前端框架·信息与通信
椎4951 天前
苍穹外卖前端nginx错误之一解决
运维·前端·nginx
@。1241 天前
对于灰度发布(金丝雀发布)的了解
开发语言·前端