NestJS定时任务

我正在使用NestJS开发项目,需要实现定时任务功能。看了官方文档发现有@nestjs/schedule模块,但在实际使用中遇到几个问题:

  1. 如何动态创建和取消定时任务?比如根据数据库配置来动态调整任务执行时间
  2. Cron表达式在NestJS中要怎么正确配置?测试时发现有些表达式不生效
  3. 定时任务执行时出现异常该怎么捕获和处理?
  4. 多个定时任务并行执行时会不会相互影响?需要做资源隔离吗?
  5. 生产环境中如何监控定时任务的执行状态和日志?

有没有实际项目经验的朋友可以分享一下最佳实践?特别是处理分布式环境下的定时任务时需要注意哪些问题?


3 回复

在NestJS中实现定时任务,你可以使用@nestjs/schedule模块。首先安装它:npm install @nestjs/schedule. 然后创建一个调度器类并使用@Interval()装饰器来定义时间间隔:

import { Component, OnModuleInit } from '@nestjs/common';
import { Interval } from '@nestjs/schedule';

@Component()
export class AppScheduler implements OnModuleInit {
  constructor() {}

  onModuleInit() {
    console.log('Scheduler is initialized!');
  }

  @Interval(5000) // 每5秒执行一次
  handleTask(): void {
    console.log('定时任务执行了!');
  }
}

如果你想基于cron表达式设置定时任务,可以使用@Cron()装饰器代替@Interval()。例如,每分钟执行一次:

@Cron('0 * * * *') // 每分钟的第0秒触发
handleCron(): void {
  console.log('Cron任务执行了!');
}

记得在模块文件中导入ScheduleModule并启用调度功能:

@Module({
  imports: [ScheduleModule.forRoot()],
})
export class AppModule {}

这样,你就可以在NestJS应用中轻松添加定时任务了。


在NestJS中实现定时任务非常方便,主要依赖@nestjs/schedule模块。首先安装依赖:

npm install --save @nestjs/schedule

然后在 AppModule 中启用 Schedule 模块:

import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';

@Module({
  imports: [
    ScheduleModule.forRoot(),
  ],
})
export class AppModule {}

接下来定义一个定时任务类,使用 @Interval() 装饰器设置执行频率:

import { Component, Interval } from '@nestjs/schedule';

@Component()
export class定时任务类 {
  @Interval(5000) // 每5秒执行一次
  handleTask() {
    console.log('定时任务执行了!');
  }
}

如果你想更灵活地管理定时任务,可以使用 @Cron() 装饰器:

import { Component } from '@nestjs/schedule';

@Component()
export class 定时任务类 {
  @Cron('0 * * * *') // 每小时的第0分钟执行
  handleTask() {
    console.log('每小时的第0分钟执行');
  }
}

记得将这个类注入到某个服务或模块中以确保它被加载。这就是在 NestJS 中实现定时任务的基本方式。

在 NestJS 中实现定时任务可以使用 @nestjs/schedule 模块,它基于 Node.js 的 node-cronnode-schedule 库。

  1. 首先安装依赖:
npm install --save @nestjs/schedule
  1. 导入 ScheduleModule:
import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';

@Module({
  imports: [ScheduleModule.forRoot()],
})
export class AppModule {}
  1. 使用定时任务的三种方式:

a. 声明式 cron 任务

import { Injectable, Logger } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';

@Injectable()
export class TasksService {
  private readonly logger = new Logger(TasksService.name);

  @Cron('45 * * * * *')  // 每分钟第45秒执行
  handleCron() {
    this.logger.debug('每分钟第45秒执行的任务');
  }
}

b. 声明式间隔任务

@Interval(10000)  // 每10秒执行一次
handleInterval() {
  this.logger.debug('每10秒执行的任务');
}

c. 声明式超时任务

@Timeout(5000)  // 应用启动5秒后执行一次
handleTimeout() {
  this.logger.debug('应用启动5秒后执行的任务');
}
  1. 动态 API 方式(在服务中注入 SchedulerRegistry):
constructor(private schedulerRegistry: SchedulerRegistry) {}

addCronJob(name: string, seconds: string) {
  const job = new CronJob(`${seconds} * * * * *`, () => {
    this.logger.warn(`动态任务 ${name} 在 ${seconds} 秒时执行`);
  });

  this.schedulerRegistry.addCronJob(name, job);
  job.start();
}

cron 表达式格式:

* * * * * *
| | | | | |
| | | | | 星期几 (0 - 7) (0或7是星期日)
| | | | 月 (1 - 12)
| | | 日 (1 - 31)
| | 小时 (0 - 23)
| 分钟 (0 - 59)
秒 (0 - 59)

注意:在生产环境中,对于复杂调度需求,可能需要考虑更专业的作业队列系统(如 BullMQ)。

回到顶部