【问题标题】:Is it possible to keep scheduled tasks from overlapping in NestJS?是否可以防止计划任务在 NestJS 中重叠?
【发布时间】:2021-06-04 15:53:01
【问题描述】:

目前,如果完成请求所需的时间大于间隔时间,长时间运行的任务将重叠(同一任务同时运行多个实例)。 下面的 NestJS 服务示例

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

function timeout(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

let c = 1

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

  @Interval(1000)
  async handleCron() {
    this.logger.debug(`start ${c}`);
    await timeout(3000)
    this.logger.debug(`end ${c}`);
    c += 1
  }
}

是否可以避免这些任务重叠并且一次只调用一个实例的任务?从技术上讲,我们可以跟踪 lock 变量,但这只会允许我们跳过一个实例,如果一个实例已经在运行。理想情况下,我们可以调用 set 一个选项来允许基于任务结束时间的间隔,而不是固定间隔(也称为开始时间)。

【问题讨论】:

  • 您可能应该使用发布/订阅消息传递基础架构来支持调用的动态特性。文档中“微服务”下的任何消息传递平台。或者像 EventEmitter 这样更简单的东西。

标签: javascript scheduled-tasks nestjs


【解决方案1】:

我一直在寻找相同的解决方案,发现 Nest 的调度程序库不再提供此问题支持。顺便说一句,我遇到了一个旧库https://github.com/miaowing/nest-schedule,我猜它不再处于维护状态,但有一个名为 config.waiting 的功能,它实际上是“如果等待是真的,调度程序将不会在此作业运行时安排作业”请尝试一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多