Skip to content

Cell - 定时任务组件 ​

Cell 后端的 Cron 任务,基于 cron 包。

bash
npm install @celljs/schedule
ts
import { Autowired } from '@celljs/core';
import { Cron, CronExpression, Scheduler } from '@celljs/schedule';

@Scheduler()
export class ReportScheduler {
    @Autowired(ReportService)
    protected readonly reports: ReportService;

    @Cron(CronExpression.EVERY_5_MINUTES)
    async refresh(): Promise<void> {
        await this.reports.refresh();
    }

    @Cron('0 30 2 * * *', { name: 'nightly', timeZone: 'Asia/Shanghai' })
    nightly(): Promise<void> {
        return this.reports.archive();
    }
}

像任何组件一样从后端 DI 模块导入该文件。

  • @Scheduler(cronJobOptions?, componentOption?) 让该类成为一个组件,其 @Cron 方法是任务。它的 cronJobOptions 应用到该类的每个任务。
  • @Cron(cronTime, options?):cronTime 是一个可选包含秒字段的 cron 表达式('*/10 * * * * *')或 Date。options 是 cron 包的 CronJob 的选项(timeZone、utcOffset、runOnInit、...)加上 name。CronExpression 有常见的表达式(EVERY_SECOND、EVERY_5_MINUTES、EVERY_DAY_AT_MIDNIGHT、...)。
  • 任务随应用启动而启动,随应用停止而停止。任务抛出的错误被记录;任务保持其调度。
  • schedule.disabled: true 不启动任何任务,例如在 cell.test.yml 中。
  • SchedulerRegistry 在运行时添加、获取和删除任务:registry.add('cleanup', { cronTime: '0 * * * *', onTick: () => ... }).start()。

任务在服务端进程内运行:只在它运行时才会运行。在无服务器 preset(fc、scf、lambda、vercel、cloudflare)上,实例由请求创建和停止,因此使用平台的定时器。