定时任务允许你按照指定的日期/时间、一定时间间隔或者一定时间后单次执行来调度(scheduling)任意代码(方法/函数)。在Linux世界中,这经常通过操作系统层面的cron包等执行。在Node.js应用中,有几个不同的包可以模拟 cron 包的功能。
安装
Nest 提供了@nestjs/schedule包,其集成了流行的 Node.js 的node-cron包
$ npm install --save @nestjs/schedule
$ npm install --save @nestjs/core
激活
要激活工作调度,从根AppModule中导入ScheduleModule并运行forRoot()静态方法
app.module.ts
import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';
@Module({
imports: [ScheduleModule.forRoot()],
})
export class AppModule {}
使用
task/task.service.ts
import { Injectable } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
@Injectable()
export class TaskService {
@Cron('*/2 * * * * *')
handleCron() {
console.log('每两秒执行一次,当前时间为:');
console.log(new Date());
}
}
@Cron()装饰器
@Cron()装饰器支持标准的cron patterns
- 星号通配符 (也就是 *)
- 范围(也就是 1-3,5)
- 步长(也就是 */2)
* * * * * *
| | | | | |
| | | | | day of week
| | | | month
| | | day of month
| | hour
| minute
second (optional)
* * * * * * 每秒
45 * * * * * 每分钟第 45 秒
_ 10 _ * * * 每小时,从第 10 分钟开始
0 _/30 9-17 _ * * 上午 9 点到下午 5 点之间每 30 分钟
0 30 11 * * 1-5 周一至周五上午 11:30
声明间隔
要声明一个以一定间隔运行的方法,使用@Interval()装饰器前缀。以毫秒单位的number传递间隔值
@Interval(10000)
handleInterval() {
this.logger.debug('Called every 10 seconds');
}
声明延时任务
要声明一个在指定时间后运行(一次)的方法,使用@Timeout()装饰器前缀。将从应用启动的相关时间偏移量(毫秒)传递给装饰器
@Timeout(5000)
handleTimeout() {
this.logger.debug('Called once after 5 seconds');
}