前端出身的我经常开会的时候会听到其他后端在说定时任务,现在写node也用到了任务调度。
这个任务调度并不是因为node是js就草率的认为是settimeout或setinterval这样的。node的任务调度会开启一个node的子进程,在子进程中进行任务调度。当然nestjs已经帮我们封装好了相关的功能。
安装
yarn add @nestjs/schedule
schedule.service.ts
任务调度设置时间需要用到Cron装饰器并且有两种设置间隔的方式
第一种为预设的CronExpression来定义间隔,下方的例子就是每10个小时执行一次。
第二种'45 * * * * *'意思是每分钟的底45秒执行一次。具体的可以看下nest官网Task Scheduling | NestJS 中文文档 | NestJS 中文网
import { Injectable, Logger } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
import loopTask from 'src/common/loopTask';
@Injectable()
export class ScheduleService {
private readonly logger = new Logger(ScheduleService.name);
// @Cron('45 * * * * *')
@Cron(CronExpression.EVERY_10_HOURS)
handleCron() {
loopTask()
this.logger.debug('Called when the current second is 45');
}
}
作为service就要在controller中引用
只需要在constructor引入就行
import {Controller} from '@nestjs/common';
import { ScheduleService } from './schedule/schedule.service';
@Controller()
export class AppController {
constructor(
private scheduleService: ScheduleService,
) {
// this.scheduleService.handleCron() // 无需调用服务器会自己启动定时器
}
}
main.ts
作为service需要在module中引入
import { Module, MiddlewareConsumer } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ScheduleModule } from '@nestjs/schedule';
import { ScheduleService } from './schedule/schedule.service';
@Module({
imports: [
ScheduleModule.forRoot(),
],
controllers: [AppController],
providers: [AppService, ScheduleService],
})
export class AppModule {}
一个简单的任务调度的例子就完成了。