定时任务
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 点 |
