14.10.2024

NestJS: Scheduled Tasks

 

Projelerimizde belli zamanlarda çalışması gereken görevler olabiliyor. Bu günün belli bir vaktinde ya da daha sık periyotlarla çalışması gereken görevleri ayarlamak için NestJS @nestjs/schedule paketini sunuyor. 

Basit bir örnek yapmak için öncelikle boş bir NestJS projesi oluşturalım. Bunun için daha önceki bu yazıma göz atabilirsiniz.

Projemizi oluşturduktan sonra aşağıdaki komutla ilgili paketi projemize ekleyelim.

npm install --save @nestjs/schedule


Daha sonra app.service.ts içine bir sonraki adımda zamanlanmış görev (scheduled task) olarak çalıştıracağımız basit bir metod yazalım. Bu metod her çalıştığında terminale zamanı yazacak. 

import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }

  logCurrentTime() {
    console.log(new Date().toLocaleString());
  }
}

Şimdi hazırlıklarımızı tamamladığımıza göre bu metodu her saniye çalıştıracak kısmı ekleyebiliriz. Öncelikle ScheduleModule'u AppModule'e import ederek zamanlanmış görevleri aktive edelim.

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ScheduleModule } from '@nestjs/schedule';

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

Sonrada servisimize görevi ekleyelim.

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

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }

  logCurrentTime() {
    console.log(new Date().toLocaleString());
  }

  @Cron('* * * * * *')
  handleCron() {
    this.logCurrentTime();
  }
}

İşlem tamam. @Cron dekoratörü ile her saniye çalışacak bir görev tanımlamış olduk. Projeyi çalıştırıp bir kaç saniye beklediğimizde aşağıdaki gibi bir sonuç karşımıza çıkacaktır.


@Cron dekoratörüne geçtiğimiz string Linux kullanıcılarına tanıdık gelmiştir. Her asterisk bir haneyi ifade ediyor. Sırayla saniye (opsiyonel), dakika, saat, gün, ay, ve son olarak haftanın gününü ifade eden bu haneleri kullanarak istediğiniz zaman için bir cron stringi oluşturabilirsiniz. Ben yazmayayım derseniz cronhub.io gibi pek çok hizmet var. Ayrıca ChatGPT'de size bu konuda yardımcı olabilir. :)

Örnek bu kadar. Elbette proje içerisinde zamanlanmış görevler için ayrı bir modül oluşturabilirsiniz. Görevlerin de ayrı sınıfları ve kendi dosyaları olabilir. Daha detaylı bilgi için her zaman NestJS dokümantasyonuna da başvurabilirsiniz. 

Esen kalın.