Scheduled Tasks — Cron Jobs

~15 daq · NestJS · Ilg'or mavzular

Muammodan boshlaylik

Ba'zi vazifalar foydalanuvchi so'roviga emas — vaqtga bog'liq:

  • Har kuni ertalab 08:00 da hisobot yuborish
  • Har soatda eskirgan tokenlarni o'chirish
  • Har haftada statistika hisoblash

Bu vazifalar uchun foydalanuvchi so'rov yuborib turishi shart emas. Server o'zi, belgilangan vaqtda bajarishi kerak.


Cron nima?

Cron — vaqt bo'yicha vazifalarni avtomatik ishlatish tizimi.


Hayotiy o'xshatma

Uyg'otkich soat. Bir marta sozlaysiz — soat har kuni o'sha vaqtda o'zi jiringlaydi. Siz har kuni qo'lda ishga tushirib turmasligingiz kerak.


O'rnatish

npm install @nestjs/schedule
npm install -D @types/cron
// app.module.ts
import { ScheduleModule } from '@nestjs/schedule';

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

Fayl tuzilmasi

src/
  tasks/
    tasks.service.ts   ← cron joblar shu yerda
    tasks.module.ts

@Cron — belgilangan vaqtda

// tasks/tasks.service.ts
import { Injectable } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';

@Injectable()
export class TasksService {

  // Har kuni yarim tunda
  @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT)
  async cleanOldSessions() {
    await this.sessionRepository.deleteExpired();
    console.log('Eskirgan sessiyalar o\'chirildi');
  }

  // Har dushanba 08:00 da
  @Cron('0 8 * * 1')
  async sendWeeklyReport() {
    const report = await this.reportsService.generate();
    await this.emailService.send('admin@company.com', report);
  }
}

CronExpression — tayyor konstantalar

Cron expressionni yodlab qolishning hojati yo'q:

@Cron(CronExpression.EVERY_MINUTE)           // har daqiqada
@Cron(CronExpression.EVERY_HOUR)             // har soatda
@Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT)  // har kuni yarim tunda
@Cron(CronExpression.EVERY_WEEK)             // har haftada
@Cron(CronExpression.EVERY_1ST_DAY_OF_MONTH_AT_MIDNIGHT) // har oyning 1-kuni

Cron Expression formati

O'z vaqtingizni yozish kerak bo'lsa:

  *    *    *    *    *
  │    │    │    │    │
  │    │    │    │    └── hafta kuni (0=yakshanba, 1=dushanba...)
  │    │    │    └─────── oy (1-12)
  │    │    └──────────── kun (1-31)
  │    └───────────────── soat (0-23)
  └────────────────────── daqiqa (0-59)

0 8 * * *     → har kuni 08:00
*/5 * * * *   → har 5 daqiqada
0 9 1 * *     → har oyning 1-kuni 09:00

💡 Expressionni sinab ko'rish: crontab.guru


@Interval — vaqt oralig'ida

Millisoniyada belgilanadi:

import { Interval } from '@nestjs/schedule';

@Interval(30000) // har 30 soniyada
async syncData() {
  await this.sync();
}

@Timeout — bir martalik kechikish

Ilova ishga tushganidan keyin faqat bir marta:

import { Timeout } from '@nestjs/schedule';

@Timeout(5000) // ishga tushganidan 5 soniya keyin bir marta
async warmUpCache() {
  await this.cacheService.preload();
}

Module

// tasks/tasks.module.ts
import { Module } from '@nestjs/common';
import { TasksService } from './tasks.service';

@Module({
  providers: [TasksService],
})
export class TasksModule {}

AppModule ga TasksModule ni import qiling.


Tez-tez uchraydigan xatolar

1. Task ishlamayapti Sababi: TasksService o'z modulining providers ga qo'shilmagan, yoki TasksModule AppModule ga import qilinmagan. Yechim: Ikkalasini tekshiring.


2. Cron expression noto'g'ri Sababi: Sintaksis xatosi. Yechim: crontab.guru da tekshirib oling.


3. Bir necha server instance da ikki marta ishlaydi Sababi: 3 ta server bor — har biri cron ni bajarayapti. Yechim: Bu murakkab muammo — katta tizimlarda Redis Lock ishlatiladi yoki alohida scheduler service ajratiladi.


Xulosa

  • @Cron() — aniq vaqtda ishlaydi (cron expression)
  • @Interval() — har N millisoniyada ishlaydi
  • @Timeout() — ilova ishga tushganidan keyin bir marta ishlaydi
  • CronExpression.EVERY_HOUR kabi tayyor konstantalar bor
  • Expression noto'g'ri bo'lsa — crontab.guru da tekshiring

Keyingi dars: 46-dars: Health Checks