Scheduled Tasks — Cron Jobs
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 ishlaydiCronExpression.EVERY_HOURkabi tayyor konstantalar bor- Expression noto'g'ri bo'lsa — crontab.guru da tekshiring
Keyingi dars: 46-dars: Health Checks