【问题标题】:CRON job executing twice at scheduled time (NestJS)CRON 作业在预定时间执行两次 (NestJS)
【发布时间】:2022-12-21 22:19:19
【问题描述】:

我想在我的 NestJs 项目中执行这个 cron 函数:

@Cron('59 23 * * *')
async CashPendingCRON(){
    let stores = await this.storeRepository.find();
    for (let store of stores){
        await this.connection
        .createQueryBuilder()
        .insert()
        .into(CashPending)
        .values([
        { cashPending: store.cashPending, store: store }
        ])
        .execute()
 }

如您所见,玉米作业应该在每天晚上 11:59 执行。但是它被执行了两次并且条目被记录在数据库中两次。当我使用 10 秒 (*/10 * * * * *) 这样的间隔时,它只会被调用一次。

如果有解决办法或者我做错了什么,请告诉我。

这是我在 app.module.ts 中添加 ScheduleModule 的方式

@Module({
  imports: [
    ScheduleModule.forRoot(),
    ConfigModule.forRoot({
      load: [appConfig, devConfig, stagConfig],
      ignoreEnvFile: true,
      isGlobal: true,
    }),
    TypeOrmModule.forRoot(
      configService.getTypeOrmConfig(),
    ),
    TypeOrmModule.forFeature([
      User,
      Vendor,
      Store,
      Product,
      Category,
      Brand,
      AppVersion
    ]),
    JwtModule.registerAsync({
      imports: [ConfigModule],
      useFactory: async () => ({
        secret: process.env.TOKEN_KEY,
      }),
      inject: [ConfigService],
    }),
    UserModule,
    UserClusterModule,
    StoreModule,
    OperationManagerModule,
    UserBrandModule,
    UserCatalogueModule,
    UserPropertyModule,
    FileModule,
    BrandModule,
    CategoryModule,
    ProductsModule,
    WarehouseModule,
    SubCategoryModule,
    StoreStocksModule,
    WarehouseStockModule,
    RtvStocksModule,
    VendorModule,
    CustomerModule,
    W2sModule,
    S2sModule,
    W2wModule,
    BillerModule,
    WarehouseManagerModule,
    AuthModule,
    OrderModule,
    GRNModule,
    SKUTimelinesModule,
    BannerModule,
    OrderReturnModule,
    UtilModule,
    POModule,
    AppVersion,
    S2wModule,
    CashOutModule
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

请帮忙。谢谢你。

【问题讨论】:

  • 您是否有将此 cron 表达式添加到两个 providers 数组的类?
  • 不,我将类(StoreService)添加到 ``` providers ``` 数组的唯一地方是它自己的模块。在此处添加参考:@Module({ imports: [ TypeOrmModule.forFeature([ User, ClusterManager, Store, Order, Biller, ReturnOrder ]), JwtModule.registerAsync({ imports: [ConfigModule], useFactory: async () => ({ secret: process.env.TOKEN_KEY, }), inject: [ConfigService], }), ], controllers: [StoreController], providers: [ StoreService, ], }) export class StoreModule {}
  • 上面的代码很难阅读,不知道如何在此处添加它。 @杰麦克唐尼尔
  • 类中的 cron 可以执行两次的任何其他方式吗?因为当我使用 10 秒 (*/10 * * * * *) 这样的间隔时,它只会被调用一次。这是一个很难破解的问题。 @杰麦克唐尼尔
  • 我可以看到它被两次添加到注册表的唯一原因是被实例化了两次,但是如果使用一个间隔它只发生一次那么我不确定。重现此方法的方法将非常有帮助

标签: cron nestjs scheduled-tasks


【解决方案1】:

我遇到了同样的问题,问题是我在一个模块中使用了imports: [ScheduleModule.forRoot()],该模块被导入了两次(由其他两个模块)。我解决了它创建一个未被任何其他模块导入的新模块并在其中添加ScheduleModule.forRoot()

调度程序.module.ts

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

调度程序.service.ts

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

@Injectable()
export class SchedulerService {
  @Cron(CronExpression.EVERY_10_SECONDS)
  handleExpiration() {
    console.log(new Date());
  }
}

控制台输出:

2022-12-21T14:04:00.005Z
2022-12-21T14:04:10.004Z
2022-12-21T14:04:20.009Z
2022-12-21T14:04:30.004Z
2022-12-21T14:04:40.011Z
...

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 2020-09-02
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多