我正在使用 NestJS。 我有一个 cron 任务需要每 10 秒运行一次。但是,我需要确保如果第一个任务仍在运行,则第二个任务不会启动。换句话说,任务只能在特定时刻执行一次。另外,如果任务需要太长时间才能完成,我想强制终止其执行。
我在@nestjs/schedule文档中找不到这样的函数。也许有人已经以装饰器或其他形式提供了现成的解决方案。如果您能分享,我将不胜感激。
import { Injectable } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
@Injectable()
export class SchedulingService {
@Cron('*/10 * * * * *', {name: 'schedulerTest'})
async schedulerTest() {
await this.testService.testFunc();
}
}
如何确保 cron 任务在 NestJS 中只执行一次?
最简单的方法是使用像
running:boolean = false
这样的简单变量。如果它启动,则在 cron 中将其设置为 true - 如果它停止,则返回 false。
import { Injectable } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
@Injectable()
export class SchedulingService {
running:boolean = false;
@Cron('*/10 * * * * *', {name: 'schedulerTest'})
async schedulerTest() {
if (!running) {
this.running = true;
await this.testService.testFunc();
this.running = false;
}
}
}
这个答案不会解决您问题的各个方面,而只会解决最后一个问题:
如何确保 cron 任务在 NestJS 中只执行一次?
为此,您可以使用
SchedulerRegistry
,如此处所述。您只需为 cronjob 指定一个名称,然后使用 SchedulerRegistry 在第一次执行时立即按名称删除 cronjob。
import { Injectable } from '@nestjs/common';
import { Cron, CronExpression, SchedulerRegistry } from '@nestjs/schedule';
@Injectable()
export class SchedulingService {
constructor(private readonly schedulerRegistry: SchedulerRegistry) {}
@Cron(CronExpression.EVERY_SECOND, {name: 'schedulerTest'})
async schedulerTest() {
// Immediately delete the cronjob again, so it will only be executed once
this.schedulerRegistry.deleteCronJob('schedulerTest');
await this.testService.testFunc();
}
}