Bvural41 1
Bvural41
mannaxxx 1
mannaxxx
Agora Metin2 1
Agora Metin2
Mt2Hizmet 1
Mt2Hizmet
berkmenoo 1
berkmenoo
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Hikaye Ekle

[NODE JS] node-cron ile Zamanlanmış Görev Oluşturma

Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 HEMEN TIKLA!

nodejs.png


[NODE JS] node-cron ile Zamanlanmış Görev Oluşturma

Merhaba arkadaşlar, bu yazıda Node.js uygulamalarınızda zamanlanmış görevler oluşturmayı öğreneceğiz. Her gün saat 3'te veritabanı yedeklemesi, her saat başı cache temizleme, her pazartesi rapor e-postası gönderme... Bu tür periyodik görevler için node-cron harika bir çözümdür. Linux'un cron daemon'ından ilham alır ama tamamen Node.js içinde çalışır.

node-cron, cron expression'ları kullanarak zamanlanmış görevler tanımlamanızı sağlar. Cron expression altı alandan oluşur: saniye (opsiyonel), dakika, saat, ayın günü, ay ve haftanın günü. Yıldız karakteri her değer anlamına gelir. Mesela her dakika çalışacak bir görev için "* * * * *" yazarsınız. Her gün saat 9'da çalışacak bir görev için "0 9 * * *" yazarsınız.

İlk kez cron expression yazarken çok karıştırmıştım. Özellikle haftanın günleri kısmı kafa karıştırıcıdır. 0 Pazar mı yoksa Pazartesi mi? Node-cron'da 0 veya 7 Pazar'dır, 1 Pazartesi'dir. Ezberlemenize gerek yok, crontab.guru gibi online araçlarla expression'ınızı test edebilirsiniz. Ben hâlâ kullanıyorum, utanacak bir şey yok.

node-cron ile görev oluşturmak çok basittir. cron.schedule() fonksiyonuna cron expression'ı ve callback fonksiyonunu verirsiniz. Görev otomatik olarak başlar. İsterseniz scheduled: false parametresi ile görevin otomatik başlamasını engelleyebilir, daha sonra task.start() ile manuel başlatabilirsiniz.

Timezone desteği de vardır. Özellikle global uygulamalarda görevlerin belirli bir timezone'a göre çalışması gerekir. timezone parametresi ile bunu belirleyebilirsiniz. Mesela Türkiye için "Europe/Istanbul" kullanırsınız. Bu çok önemli bir detaydır, sunucunuz farklı timezone'da olsa bile görevleriniz doğru zamanda çalışır.

Görev yönetimi de mümkündür. task.stop() ile görevi durdurabilir, task.start() ile tekrar başlatabilirsiniz. task.destroy() ile görevi tamamen kaldırabilirsiniz. Bu özellikle dinamik görev yönetimi gereken uygulamalarda işe yarar.

Hata yönetimi konusunda dikkatli olun. Cron görevlerinde fırlatılan hatalar uygulamanızı çökertebilir. Her görevin içinde try-catch bloğu kullanın. Ayrıca görevin ne kadar sürdüğünü loglamanızı öneririm. Bir görev beklenenden uzun sürüyorsa, bir sonraki çalışma zamanıyla çakışabilir. Bu durumu engellemek için bir kilit mekanizması kullanabilirsiniz.

Kod:
// cronJobs.js - node-cron ile zamanlanmış görevler
const cron = require('node-cron');
const fs = require('fs');
const path = require('path');

// Cron expression formatı:
// ┌────────── saniye (opsiyonel, 0-59)
// │ ┌──────── dakika (0-59)
// │ │ ┌────── saat (0-23)
// │ │ │ ┌──── ayın günü (1-31)
// │ │ │ │ ┌── ay (1-12)
// │ │ │ │ │ ┌ haftanın günü (0-7, 0 ve 7 = Pazar)
// │ │ │ │ │ │
// * * * * * *

// 1) Her dakika çalışan görev
const dakikalikGorev = cron.schedule('* * * * *', () => {
  var tarih = new Date().toISOString();
  console.log('[' + tarih + '] Dakikalık kontrol çalıştı');
}, {
  scheduled: false
});

// 2) Her saat başı çalışan cache temizleme
const cachTemizleme = cron.schedule('0 * * * *', () => {
  console.log('Cache temizleme başladı...');
  try {
    // Örnek: Geçici dosyaları temizle
    var tempDir = path.join(__dirname, 'temp');
    if (fs.existsSync(tempDir)) {
      var dosyalar = fs.readdirSync(tempDir);
      var silinen = 0;
      dosyalar.forEach(function(dosya) {
        var dosyaYolu = path.join(tempDir, dosya);
        var stats = fs.statSync(dosyaYolu);
        var birSaatOnce = Date.now() - (60 * 60 * 1000);
        if (stats.mtimeMs < birSaatOnce) {
          fs.unlinkSync(dosyaYolu);
          silinen++;
        }
      });
      console.log(silinen + ' adet eski dosya silindi');
    }
  } catch (error) {
    console.error('Cache temizleme hatası:', error.message);
  }
}, {
  timezone: 'Europe/Istanbul'
});

// 3) Her gün gece 03:00'te veritabanı yedekleme
var yedeklemeKilidi = false;

var veritabaniYedekleme = cron.schedule('0 3 * * *', async () => {
  if (yedeklemeKilidi) {
    console.log('Yedekleme zaten devam ediyor, atlanıyor...');
    return;
  }
  yedeklemeKilidi = true;

  try {
    console.log('Veritabanı yedekleme başladı...');
    var tarih = new Date().toISOString().split('T')[0];
    var yedekDosya = 'backup-' + tarih + '.sql';

    // Simüle edilmiş yedekleme işlemi
    await new Promise(function(resolve) {
      setTimeout(resolve, 2000);
    });

    console.log('Yedekleme tamamlandı: ' + yedekDosya);

    // Eski yedekleri temizle (7 günden eski)
    console.log('Eski yedekler kontrol ediliyor...');
  } catch (error) {
    console.error('Yedekleme hatası:', error.message);
  } finally {
    yedeklemeKilidi = false;
  }
}, {
  timezone: 'Europe/Istanbul'
});

// 4) Her Pazartesi sabah 09:00'da haftalık rapor
var haftalikRapor = cron.schedule('0 9 * * 1', () => {
  console.log('Haftalık rapor hazırlanıyor...');
  try {
    var rapor = {
      tarih: new Date().toISOString(),
      toplamKullanici: 1500,
      yeniKayit: 45,
      aktifKullanici: 890,
      toplamSiparis: 320,
      gelir: 25600
    };
    console.log('Rapor hazır:', JSON.stringify(rapor, null, 2));
    // E-posta ile gönderme işlemi burada yapılır
  } catch (error) {
    console.error('Rapor hatası:', error.message);
  }
}, {
  timezone: 'Europe/Istanbul'
});

// 5) Her ayın 1'inde gece yarısı aylık temizlik
var aylikTemizlik = cron.schedule('0 0 1 * *', () => {
  console.log('Aylık temizlik başladı...');
  try {
    // Log dosyalarını arşivle
    // Geçici verileri temizle
    // İstatistikleri sıfırla
    console.log('Aylık temizlik tamamlandı');
  } catch (error) {
    console.error('Aylık temizlik hatası:', error.message);
  }
});

// Görev yönetimi fonksiyonları
function tumGorevleriBaşlat() {
  dakikalikGorev.start();
  console.log('Tüm zamanlanmış görevler başlatıldı');
}

function tumGorevleriDurdur() {
  dakikalikGorev.stop();
  cachTemizleme.stop();
  veritabaniYedekleme.stop();
  haftalikRapor.stop();
  aylikTemizlik.stop();
  console.log('Tüm zamanlanmış görevler durduruldu');
}

// Cron expression geçerliliğini kontrol etme
function cronGecerliMi(expression) {
  return cron.validate(expression);
}

console.log('Cron geçerli mi (her dakika): ' + cronGecerliMi('* * * * *'));
console.log('Cron geçerli mi (hatalı): ' + cronGecerliMi('* * * *'));

module.exports = { tumGorevleriBaşlat, tumGorevleriDurdur };

// npm install node-cron
// node cronJobs.js

Zamanlanmış görevler uygulama geliştirmenin önemli bir parçasıdır. node-cron basit ve etkili bir çözümdür ama çok kritik görevler için Bull, Agenda gibi iş kuyruğu kütüphanelerini de değerlendirmenizi öneririm. Onlar Redis tabanlı çalışır ve daha robust bir çözüm sunar. Kolay gelsin!
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst