Skip to content

定时任务

youlai-nest 当前未集成定时任务框架。如有需求,推荐以下方案:

推荐方案

方案一:@nestjs/schedule

bash
pnpm add @nestjs/schedule

配置

typescript
// app.module.ts
import { ScheduleModule } from '@nestjs/schedule';

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

定义任务

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

@Injectable()
export class SchedulerService {
  // 每天凌晨 2 点执行
  @Cron('0 2 * * *')
  async handleDailyCleanup() {
    console.log('执行清理任务...');
  }

  // 每 5 分钟执行
  @Cron(CronExpression.EVERY_5_MINUTES)
  async handleSync() {
    console.log('执行同步任务...');
  }
}

方案二:BullMQ

适用于分布式任务队列:

bash
pnpm add @nestjs/bullmq bullmq

配置

typescript
// app.module.ts
import { BullModule } from '@nestjs/bullmq';

@Module({
  imports: [
    BullModule.forRoot({
      connection: {
        host: 'localhost',
        port: 6379,
      },
    }),
    BullModule.registerQueue({
      name: 'email',
    }),
  ],
})
export class AppModule {}

定义消费者

typescript
import { Processor, WorkerHost } from '@nestjs/bullmq';

@Processor('email')
export class EmailProcessor extends WorkerHost {
  async process(job: Job) {
    console.log('处理邮件任务:', job.data);
  }
}

添加任务

typescript
import { InjectQueue } from '@nestjs/bullmq';
import { Queue } from 'bullmq';

@Injectable()
export class EmailService {
  constructor(@InjectQueue('email') private emailQueue: Queue) {}

  async sendEmail(to: string, subject: string) {
    await this.emailQueue.add('send', { to, subject });
  }
}

Cron 表达式

表达式说明
0 2 * * *每天凌晨 2 点
0 */5 * * * *每 5 分钟
0 0 1 * *每月 1 号 0 点
0 9-17 * * 1-5周一到周五 9-17 点

相关资源

基于 MIT 许可发布