如何确保 cron 任务在 NestJS 中只执行一次?

问题描述 投票:0回答:2

我正在使用 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 中只执行一次?

node.js typescript cron nestjs scheduled-tasks
2个回答
0
投票

最简单的方法是使用像

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;
    }
  }
}

0
投票

这个答案不会解决您问题的各个方面,而只会解决最后一个问题:

如何确保 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();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.