Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C# – Quartz.Net Kütüphanesi İle Zamanlanmış Görevler Oluşturma

Merhaba,

Masaüstü veya Web projelerinde belirli periyotluk yapılması yahut tetiklenmesi gereken işlemlerin ihtiyacını hissetmişsinizdir. İşte böyle durumlarda prosedürel olarak binbir türlü işlem gerçekleştirebilir, ihtiyacınızı giderebilirsiniz. Tabi birde Quartz.Net kütüphanesini kullanarak daha pratik bir şekilde hareket edebilir, projenize dinamizm ve hız kazandırabilirsiniz.

Şimdi bu içeriğimizde Quartz.Net kütüphanesini kullanarak örnek bir projede görevler zamanlayacağız. Tabi projede örneklendirmeyi yapmadan önce Quartz.Net kütüphanesini a’dan z’ye inceleyecek ve size nasıl bir mekanizmayla çalıştığını göstereceğim.

Öncelike Quartz.Net kütüphanesini projeye entegre edebilmek için “Package Manager Console” penceresine “Install-Package Quartz” komutunu yazıp, entera basınız. Eğer komut çalışmıyorsa şu adrese göz atınız.

Velhasıl, ilgili DLL’i projeye entegre ettiğinizi varsayıyorum.

Şimdi buradaki mekanizmayı şöyle düşüneceğiz.
Görev -> Görev Tetikleyici[Tetiklenirken Şartlar Belirtilecek]

Yani bir görevimiz olacak, bu görev yeri ve zamanı geldimi tetiklenecektir. Tetiklenme sürecinde verilen başlangıç zamanı, tetiklenme periyodu ve kaç kere tetikleneceği gibisinden faktörler belirtilecektir.

Şimdi bir görev oluşturalım.

    class Gorev : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine("Görevdeyiz...");
        }
    }

Gördüğünüz gibi bir görevimiz mevcut.

Şimdide görev tetikleyiciyi oluşturalım.

    class Tetikleyici
    {
        private IScheduler Baslat()
        {
            ISchedulerFactory schedFact = new StdSchedulerFactory();
            IScheduler sched = schedFact.GetScheduler();
            if (!sched.IsStarted)
                sched.Start();

            return sched;
        }

        public void GoreviTetikle()
        {
            IScheduler sched = Baslat();

            IJobDetail Gorev = JobBuilder.Create<Gorev>().WithIdentity("Gorev", null).Build();

            ISimpleTrigger TriggerGorev = (ISimpleTrigger)TriggerBuilder.Create().WithIdentity("Gorev").StartAt(DateTime.UtcNow).WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever()).Build();
            sched.ScheduleJob(Gorev, TriggerGorev);
        }
    }

Yukarıdaki kod bloğunu incelerseniz eğer “Baslat” metodu ile zamanlayıcımızı oluşturuyor, çalışmıyor ise çalıştırarak geriye gönderiyoruz. “GoreviTetikle” isimli metod içerisinde ise görevimizin tetikleyicisini oluşturuyoruz. “IJobDetail” Interface’i tipinden “Gorev” referansına bir “Gorev” tipinde iş kurucusu oluşturuyor ve “Gorev” identity değerini vererek oluşan yapıyı atıyoruz.

“ISimpleTrigger” Interface’i tipinden “TriggerGorev” isimli referansa ise bir Trigger yapısı oluşturuyoruz ve “Gorev” identitiy değerini veriyoruz. Bu Trigger’ın süreçte hangi faktörlere göre tetikleneceğini kod bloğunda gördüğünüz metodlar aracılığıyla veriyoruz. Şimdi örnekte olan ve olmayan metodların özelliklerini aşağıda belirtelim.

  • StartAt Metodu
    Zamanlayıcının hangi tarihte başlayacağını belirtiriz.
  • WithSimpleSchedule Metodu
    Zamanlayıcının başladıktan sonraki programını belirtmek için kullanılır.
  • WithIntervalInSeconds Metodu
    Zamanlayıcının kaç saniyede bir tetikleneceğini belirtiriz.
  • WithIntervalInMinutes Metodu
    Zamanlayıcının kaç dakikada bir tetikleneceğini belirtiriz.
  • WithIntervalInHours Metodu
    Zamanlayıcının kaç saatte bir tetikleneceğini belirtiriz.
  • WithRepeatCount Metodu
    Zamanlayıcının kaç tekrardan sonra duracağını belirtiriz.
  • RepeatForever Metodu
    Zamanlayıcının sonsuza denk çalışacağını belirtiriz.

En sonunda “ScheduleJob” metodu ile görev ve Trigger’ı birbirine bağlıyoruz.

Yukarıdaki örnekte görevimiz 5 saniyede bir sonsuza kadar çalışacaktır.

Şimdi görevimizi tetikleyelim.

    class Program
    {
        static void Main(string[] args)
        {
            Tetikleyici tetikle = new Tetikleyici();
            tetikle.GoreviTetikle();
        }
    }

Evet, artık görevimizin belirttiğimiz değer aralığında sonsuza kadar tetiklendiğini aşağıdaki videodan görebilirsiniz.

Şimdi sıra geldi örnek projeyi yapmaya. Senaryomuz aşağıdaki gibi olacaktır.

“Biz bir öğretmeniz ve sınıfımızda çok konuşan öğrencileri 10 dk’lığına tek ayak üstünde bekletiyoruz.”

Hadi projemize başlayalım.

    class Ogrenci
    {
        public int OgrenciNo { get; set; }
        public string Adi { get; set; }
        public string SoyAdi { get; set; }
        public bool Ceza { get; set; }
    }
    class DersGorev : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            JobDataMap data = context.JobDetail.JobDataMap;
            Console.WriteLine($"{data.GetString("Adi")} {data.GetString("SoyAdi")} tek ayakta bekliyor...");
        }
    }
    class Tetikleyici
    {
        private IScheduler Baslat()
        {
            ISchedulerFactory schedFact = new StdSchedulerFactory();
            IScheduler sched = schedFact.GetScheduler();
            if (!sched.IsStarted)
                sched.Start();

            return sched;
        }

        public Ogrenci Ogrenci { get; set; }

        public void DersTetikle()
        {
            IScheduler sched = Baslat();

            IJobDetail DersGorev = JobBuilder.Create<DersGorev>().WithIdentity("DersGorev", null).UsingJobData("Adi", Ogrenci.Adi).UsingJobData("SoyAdi", Ogrenci.SoyAdi).Build();


            ISimpleTrigger TriggerDersGorev = (ISimpleTrigger)TriggerBuilder.Create().WithIdentity("DersGorev").StartAt(DateTime.UtcNow).WithSimpleSchedule(x => x.WithIntervalInSeconds(15).WithRepeatCount(1)).Build();
            sched.ScheduleJob(DersGorev, TriggerDersGorev);
        }
    }
        static void Main(string[] args)
        {
            List<Ogrenci> ogrenciler = new List<Ogrenci>() {
                new Ogrenci { OgrenciNo = 1, Adi="Ali", SoyAdi = "Yıldırım", Ceza = false},
                new Ogrenci { OgrenciNo = 2, Adi="Veli", SoyAdi = "Gök", Ceza = true},
                new Ogrenci { OgrenciNo = 3, Adi="Mehmet", SoyAdi = "Onbaşı", Ceza = false},
                new Ogrenci { OgrenciNo = 4, Adi="Ayşe", SoyAdi = "Candar", Ceza = false},
                new Ogrenci { OgrenciNo = 5, Adi="Can", SoyAdi = "Köse", Ceza = false},
                new Ogrenci { OgrenciNo = 6, Adi="Turgay", SoyAdi = "Arslan", Ceza = false},
                new Ogrenci { OgrenciNo = 7, Adi="Faruk", SoyAdi = "Menteş", Ceza = false}
            };

            foreach (var Ogrenci in ogrenciler)
            {
                if (Ogrenci.Ceza)
                {
                    Tetikleyici tetikle = new Tetikleyici();
                    tetikle.Ogrenci = Ogrenci;
                    tetikle.DersTetikle();
                }
            }

            Console.Read();
        }

Örnek projeyi buradan indirebilirsiniz.

Sonraki yazılarımda görüşmek üzere…

İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

9 Cevaplar

  1. Unal Alpay dedi ki:

    Şimdi bu arkaplanda da çalışırmı uygulamayı kapattığımız zaman yani serverda?

    • Gökhan dedi ki:

      Tabiki çalışır. Ben server’da 6 ayrı task oluşturdum ve çalıştırdım. Sorun yok, aksama yok. IIS çalıştığı sürece, çalışmaya devam ediyor.

      • Gençay dedi ki:

        Tabi ki de uygulamayı bir şekilde sonlandırmadığınız taktirde çalışacaktır. Ama uygulama kapanırsa, son bulursa veyahut olası hatalarla karşılaşırsa arka planda istediği kadar server açık olsun, genede çalışmayacaktır.

  2. OĞUZHAN SARI dedi ki:

    Bu QuartzNet in çalışması için sunucu tarafında QuartzNet için herhangi bir uygulama, eklenti vs kurulması gerekiyor mu?

  3. Anonim dedi ki:

    Merhaba,localde tüm ayarlarıyla sorunsuz çalışıyor ancak Sunucuda sadece kısa aralıklarda saniye veya dakika cinsinden yapınca çalışıyor ( örn: 5 dkkada bir gibi veya 25 sn de bir gibi) ama saat cinsinden yaptığımda sadece 1 kere gönderiyor ve sonraki tetiklemeleri almıyor. Bunun nedeni ne olabilir ?(Not: normalde bunu 24 saatte bir yapmak istiyorum) Kod;

    ITrigger trigger = TriggerBuilder.Create()
    
    .WithIdentity("trigger1", "group1")
    .StartNow()
    .WithSimpleSchedule(x =&gt; x
    .WithIntervalInHours(60)
    .RepeatForever())
    .Build();
    
  4. Onur dedi ki:

    Hocam Mvc uygulamasında nasıl kullanacağız ekrana basamadım ViewBag ile nasıl ekrana basabilirim

  1. 08 Nisan 2019

    […] Hangfire; çok yabancı olmadığımız ve zamanında hakkında detaylı makale yazdığımız Quartz.Net kütüphanesinin güzel bir muadilidir […]

Gökhan için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir