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 让我们删除和添加这三种类型的定时任务。

相关推荐
invicinble38 分钟前
c端系统,其实更像一个信息展示平台
前端
李姆斯1 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
戮漠summer2 小时前
Missing Semester 计算机教育中缺失的一课 Lecture 01 Shell
开发语言·后端·scala
名字还没想好☜2 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司2 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
江华森3 小时前
Web 开发基础:HTTP 与 REST
前端·网络协议·http
IT_陈寒3 小时前
Redis的KEYS命令把我搞崩溃了,改用SCAN才活过来
前端·人工智能·后端
长不胖的路人甲4 小时前
SpringCloud 服务雪崩、熔断、降级
后端·spring·spring cloud
Jackson__4 小时前
为什么 Agent 越聊越慢?聊聊 Context(上下文)管理
前端·agent·ai编程
KaMeidebaby4 小时前
卡梅德生物技术快报|抗体合成:多肽抗体合成工程化方案:Nsp2 保守肽多抗制备与多维度验证
前端·网络·数据库·人工智能·算法