Skip to content

Lập lịch tác vụ ​

Lên lịch cho các tác vụ định kỳ với biểu thức cron, khoảng thời gian và thời gian chờ.

Cài đặt ​

bash
bun add @galaxy-stack/orbit-schedule

Thiết lập ​

typescript
import { Module } from '@galaxy-stack/orbit-core';
import { ScheduleModule } from '@galaxy-stack/orbit-schedule';

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

Công việc Cron ​

typescript
import { Injectable } from '@galaxy-stack/orbit-core';
import { Cron, CronExpression } from '@galaxy-stack/orbit-schedule';

@Injectable()
export class TaskService {
  @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT)
  handleDailyCleanup() {
    console.log('Đang chạy dọn dẹp hàng ngày...');
  }

  @Cron('0 0 * * 0') // Mỗi Chủ Nhật lúc nửa đêm
  handleWeeklyReport() {
    console.log('Đang tạo báo cáo hàng tuần...');
  }

  @Cron('*/5 * * * *') // Mỗi 5 phút
  handleFrequentTask() {
    console.log('Chạy mỗi 5 phút...');
  }
}

Biểu thức Cron ​

Biểu thứcMô tả
* * * * *Mỗi phút
0 * * * *Mỗi giờ
0 0 * * *Mỗi ngày lúc nửa đêm
0 0 * * 0Mỗi Chủ Nhật
0 0 1 * *Ngày đầu tiên của tháng
*/15 * * * *Mỗi 15 phút

Biểu thức tích hợp ​

typescript
import { CronExpression } from '@galaxy-stack/orbit-schedule';

CronExpression.EVERY_SECOND
CronExpression.EVERY_MINUTE
CronExpression.EVERY_HOUR
CronExpression.EVERY_DAY_AT_MIDNIGHT
CronExpression.EVERY_WEEK
CronExpression.EVERY_MONTH
CronExpression.EVERY_YEAR

Khoảng thời gian ​

typescript
import { Interval } from '@galaxy-stack/orbit-schedule';

@Injectable()
export class TaskService {
  @Interval(5000) // Mỗi 5 giây
  handleInterval() {
    console.log('Chạy mỗi 5 giây');
  }

  @Interval('metrics', 10000)
  collectMetrics() {
    console.log('Thu thập số liệu...');
  }
}

Thời gian chờ ​

typescript
import { Timeout } from '@galaxy-stack/orbit-schedule';

@Injectable()
export class TaskService {
  @Timeout(5000) // Chạy một lần sau 5 giây
  handleTimeout() {
    console.log('Thực thi một lần sau 5 giây');
  }

  @Timeout('warmup', 1000)
  warmupCache() {
    console.log('Bộ nhớ cache đã được khởi động');
  }
}

Lập lịch động ​

typescript
import { Injectable } from '@galaxy-stack/orbit-core';
import { SchedulerRegistry, CronJob } from '@galaxy-stack/orbit-schedule';

@Injectable()
export class DynamicTaskService {
  constructor(private schedulerRegistry: SchedulerRegistry) {}

  addCronJob(name: string, cronTime: string) {
    const job = new CronJob(cronTime, () => {
      console.log(`Đang chạy công việc: ${name}`);
    });

    this.schedulerRegistry.addCronJob(name, job);
    job.start();
  }

  deleteCronJob(name: string) {
    this.schedulerRegistry.deleteCronJob(name);
  }

  getCronJobs() {
    return this.schedulerRegistry.getCronJobs();
  }

  addInterval(name: string, milliseconds: number) {
    const interval = setInterval(() => {
      console.log(`Đang chạy khoảng thời gian: ${name}`);
    }, milliseconds);

    this.schedulerRegistry.addInterval(name, interval);
  }
}

Tùy chọn công việc ​

typescript
@Cron('0 0 * * *', {
  name: 'daily-cleanup',
  timeZone: 'Asia/Ho_Chi_Minh',
})
handleDailyCleanup() {}

Xử lý lỗi ​

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

  @Cron('*/5 * * * *')
  async handleTask() {
    try {
      await this.doWork();
    } catch (error) {
      this.logger.error('Tác vụ thất bại:', error);
      // Tùy chọn thông báo, thử lại, v.v.
    }
  }
}

Kiểm soát đồng thời ​

Ngăn chặn việc thực thi trùng lặp:

typescript
@Injectable()
export class TaskService {
  private isRunning = false;

  @Cron('*/1 * * * *')
  async handleTask() {
    if (this.isRunning) {
      console.log('Tác vụ trước vẫn đang chạy, bỏ qua...');
      return;
    }

    this.isRunning = true;
    try {
      await this.longRunningTask();
    } finally {
      this.isRunning = false;
    }
  }
}

Released under the MIT License.