Yazılım Mimarileri ve Tasarım Desenleri Üzerine

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.

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…

Exit mobile version