嵌套调度 npm 不起作用

Poo*_*wat 7 node.js nestjs

我正在使用 nest.js 框架来开发基于节点的应用程序。我正在尝试使用https://www.npmjs.com/package/nest-schedule 中提到的 nest-schedule 编写调度程序。

不知何故,当与@Cron 或@Schedule 一起使用时,代码不起作用。休息其他装饰者工作正常。使用与上面链接中提到的相同的代码库。任何人都可以帮助我设置它并使用 nodejs 中使用的精确 cron 模式

Cas*_*rin 8

对于当前版本的 Nest,您可以使用 Nestjs/schedule。看看我如何使用 Nestjs/schedule 实现这一目标。

第一:安装nestjs cli

npm i -g @nestjs/cli
Run Code Online (Sandbox Code Playgroud)

第二:创建一个新项目

nest new schedule-sample
Run Code Online (Sandbox Code Playgroud)

第三:安装nestjs时间表

npm install --save @nestjs/schedule
Run Code Online (Sandbox Code Playgroud)

第四:生成一个新服务来放置您的服务。

nest generate service cron
Run Code Online (Sandbox Code Playgroud)

安装该包后,将其添加到 app.module 中,如下所示:

import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';
import { CronService } from './cron.service';

@Module({
  imports: [
    ScheduleModule.forRoot()
  ],
  providers: [CronService],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

第五:您可以如下所示运行它(完整的说明在这里https://docs.nestjs.com/techniques/task-scheduling):

@Cron('*/5 * * * * *')
runEvery10Seconds() {
 console.log('Run it every 5 seconds');
}
Run Code Online (Sandbox Code Playgroud)

这是完整的示例 (cron.service.ts)。

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

@Injectable()
export class CronService {

    private readonly logger = new Logger(CronService.name);

    @Cron('*/5 * * * * *')
    runEvery10Seconds() {
        this.logger.debug('Run it every 5 seconds');
    }


    @Cron('10 * * * * *')
    handleCron() {
        this.logger.debug('Called when the current second is 10');
    }

    @Interval(10000)
    handleInterval() {
        this.logger.debug('Called every 10 seconds');
    }
}
Run Code Online (Sandbox Code Playgroud)

最后的想法:
安排作业的最复杂的方法是使用动态 cron 作业。为此,您可以使用 SchedulerRegistry API 从代码中的任何位置按名称获取对 CronJob 实例的引用。首先,使用标准构造函数注入注入 SchedulerRegistry:

constructor(private schedulerRegistry: SchedulerRegistry) {}
Run Code Online (Sandbox Code Playgroud)

提示 从 @nestjs/schedule 包导入 SchedulerRegistry。然后在类中使用它,如下所示。假设使用以下声明创建了 cron 作业:

@Cron('* * 8 * * *', {
  name: 'notifications',
})
triggerNotifications() {}
Run Code Online (Sandbox Code Playgroud)

使用以下方式访问此职位:

const job = this.schedulerRegistry.getCronJob('notifications');

job.stop();
console.log(job.lastDate());
Run Code Online (Sandbox Code Playgroud)

我已经在以下版本(package.json)中对其进行了测试

"@nestjs/common": "^7.6.15",
"@nestjs/core": "^7.6.15",
"@nestjs/schedule": "^0.4.3",
Run Code Online (Sandbox Code Playgroud)

  • 我必须将“CronService”包含在“providers”列表中。即`@Module({导入:[ScheduleModule.forRoot()],提供者:[CronService],})` (4认同)

Nir*_*Nir 6

遇到同样的问题,cron 作业没有启动,解决方法如下:

async function bootstrap() {

  const app = await NestFactory.createApplicationContext(AppModule);
  
  // add this, if network if network listener is needed :
  await app.listen(<port>)

  // or this if network is not needed :
  await app.init()

}

bootstrap();
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是有效的..特别是如果你在微服务中运行@nestjs/scheduler..而且看起来公牛队列也有同样的问题..添加“await app.init()”突然使我们的队列微服务工作了有另一个版本的队列微服务可以完全工作,这是因为微服务处于混合模式(微服务+http层) (2认同)

Iho*_*yuk 1

@Cron()装饰器直到v0.3.1@Schedule()才真正起作用(github问题)。

您可以尝试一下最新版本吗?

package.json

{
    ...
    "dependencies": {
        "nest-schedule": "^0.3.1"
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

scheduler.service.ts

import { Injectable } from '@nestjs/common';
import { Cron, NestSchedule } from 'nest-schedule';

@Injectable()
export class SchedulerService extends NestSchedule {

    // ...

    @Cron('* * * * * *') // Run every second
    scheduledJob() {
        console.info('[Scheduler]: scheduled jobs has been started');

        // ...
    }

    // ...

}
Run Code Online (Sandbox Code Playgroud)

对我有用。