Như các bạn biết rồi đấy trong quá trình xây dựng website của chúng ta, đôi lúc chúng ta cần lên kế hoạch hay dự định cho một công việc hay nhiệm vụ chạy vào một khoảng thời gian nhất định có thể là trong ngày, trong tuần… Vì vậy Task Scheduling là thứ không thể thiếu đối với mỗi framework được xây dựng ra.
Trong Linux,điều này thường được xử lý bởi các gói như cron ở cấp hệ điều hành. Đối với các ứng dụng Node.js, có một số gói mô phỏng chức năng giống như cron. Nest cung cấp gói @nestjs/schedule, tích hợp với gói cron Node.js phổ biến.
Cài đặt
Để bắt đầu sử dụng nó, trước tiên chúng ta cài đặt các package cần thiết.
$ npm install --save @nestjs/schedule
$ npm install --save-dev @types/cron
Để kích hoạt job scheduling, ta cần import ScheduleModule vào root AppModule và chạy forRoot() ở file app.module.ts
import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';
@Module({
imports: [
ScheduleModule.forRoot()
],
})
export class AppModule {}
The .forRoot()
khởi tạo scheduler và đăng ký declarative cron jobs, thời gian chờ và khoảng thời gian tồn tại trong ứng dụng. Quá trình đăng ký diễn ra khi vòng đời onApplicationBootstrap diễn ra, đảm bảo rằng tất cả các mô-đun đã tải và khai báo mọi scheduled jobs.
Declarative cron jobs
Một cron job schedules cho 1 function tùy ý (method call) để chạy tự động. Cron jobs đó có thể chạy:
- Một lần, vào một ngày/thời gian xác định.
- Chạy định kỳ. Các công việc định kỳ có thể chạy tại một thời điểm cụ thể trong một khoảng thời gian cụ thể (ví dụ: một lần mỗi giờ, một lần mỗi thứ 2 đầu tuần, cứ sau 5 phút một lần)
Khai báo một cron job với decorator @Cron() trước định nghĩa phương thức chứa code sẽ được thực thi, như sau:
import { Injectable, Logger } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
@Injectable()
export class TasksService {
private readonly logger = new Logger(TasksService.name);
@Cron('45 * * * * *')
handleCron() {
this.logger.debug('Called when the current second is 45');
}
}
Trong ví dụ này, phương thức handleCron() sẽ được gọi mỗi khi giây hiện tại là 45. Nói cách khác, phương thức này sẽ được chạy một lần mỗi phút, ở mốc 45 giây.
@Cron() hỗ trợ vài mẫu tiêu chuẩn:
- Asterisk (e.g.
*
) - Ranges (e.g.
1-3,5
) - Steps (e.g.
*/2
)
Trong ví dụ trên, chúng ta đã chuyển 45 * * * * * cho decorator. Following key cho biết cách diễn giải từng vị trí trong chuỗi mẫu cron:
* * * * * *
| | | | | |
| | | | | day of week
| | | | months
| | | day of month
| | hours
| minutes
seconds (optional)
Qua một ví dụ đơn giản như trên thì mình mong rằng phần kiến thức mình chia sẻ sẽ giúp cho các bạn phần nào mường tượng ra cách Schedule trong NestJs nó hoạt động như thế nào. Cảm ơn các bạn đã đọc bài viết của mình.