Quartz .Net Nedir Nasıl Kullanılır ?

Quartz.Net, geliştirdiğiniz web tabanlı projelerde scheduled task yani zamana dayalı planlı görevler çalıştırmak istediğinizde çok kolay bir şekilde implement edip kullanabileceğiniz open source bir kütüphanedir. Aslında bir çok kişi bu tarz işlemleri yapmak için bir console uygulaması geliştirir ve windows server'da task schedular'a bu uygulamayı ne zaman çalıştıracağını söyler ve iş biter. Ancak gerek sunucuya erişimin kısıtlı olduğu durumlarda, gerekse ikinci bir uygulama geliştirmenin yol açtığı efor düşündüğünde quartz.net daha avantajlı gibi görünüyor.

Kullanım olarak iki aşamadan oluşuyor diyebiliriz,

  1. Çalışacak olan Job'ı belirleme,
  2. Hangi zaman aralıklarında çalışacağı bilgisi set edilir.

Quartz 3 ana bileşenden oluşur, job, trigger, schedular. Job yapılacak olan iştir. Trigger job'ın ne zaman, ne şekilde tetikleneceği emrini veren & tetikleyen yapıdır. Job ve Trigger ikisi birlikte schedular'a register olurlar ve kısaca çalışma şekli olarak; job schedular üzerinden trigger tarafından çalıştırılır diyebiliriz.

Örnek bir case üzerinden ilerleyelim; bir banka web service projemiz olsun ve müşterilere her gün saat 13:30 da push notification yollayan bir kampanyalar job'ı geliştirelim.

1. Quartz.Net Kurulumu

Kurulum için projenize sağ tıklayıp Manage Nuget Packages dedikten sonra aşağıdaki gibi nuget'ten projeyi install edebiliriz.

 

2. Job'ı Oluşturma

Bunun için ilk olarak IJob interface'inden implement olan CampaignPushJob adında bir class oluşturalım. IJob ile birlikte class'ımız Execute adında bir metoda sahip olur ve job çalışırken aslında bu metot içerisindeki akış çalışır diyebiliriz.

    public class CampaignPushJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            var userRepository = new UserRepository();
            var userList = userRepository.GetPNUserList();

            var pushNotText = "Size özel konut kredisi teklifleri.";

            var pnService = new PnService();
            pnService.SendPush(pushNotText, userList);
        }
    }

Örnekte PnService adında bir service'imiz olduğunu varsayalım ve SendPush metodu ile kullanıcılara notification gönderiliyor olsun.

3. Schedular Oluşturma

Bu adımda CampaignPushJobScheduler adında içerisinde ne zaman ve neyi çalıştıracağı bilgisini verdiğimiz schedular'ımızı yazıyoruz. JobBuilder.Create<CampaignPushJob>().Build() satırında da görüldüğü gibi bizden bir adet IJob interface'ini implement etmiş class istemekte. Bizde bir üstte yazdığımız CampaignPushJob'ını buraya set ediyoruz. Ne zaman çalıştıracağı bilgisini ise TriggerBuilder'ı initialize ederken set edeceğiz. Örneğimizde her gün saat 13:30 da çalışmasını istediğimiz bir job çalıştırmak istediğimiz için TriggerBuilder içerisinde aşağıdaki gibi bir tanımlama yaptık.

    public class CampaignPushJobScheduler
    {
        public static void Start()
        {
            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();

            IJobDetail job = JobBuilder.Create<CampaignPushJob>().Build();

            ITrigger trigger = TriggerBuilder.Create()
                .WithDailyTimeIntervalSchedule
                  (s =>
                     s
                    .OnEveryDay() //hergün çalışacağı bilgisi
                    .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(13, 30)) //hergün hangi saatte çalışacağı bilgisi
                  )
                .Build();

            scheduler.ScheduleJob(job, trigger);
        }
    }

4. Schedular Start Etme

Bu adıma kadar job, schedular ve trigger bilgilerimizi oluşturduk ve artık uygulama ayağa kalktıktan sonra schedular'ı start etmemiz gerekiyor. Geliştirmekte olduğumuz proje bir Asp.Net projesi olduğundan bu işlemi kolayca Global.asax dosyası içerisinde bulunan Application_Start metodunda yapabiliriz. Tek yapmamız gereken CampaignPushJobScheduler'ın içerisinde bulunan Start metodunu çağırmak.

    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            CampaignPushJobScheduler.Start();
        }
    }

Quartz.Net implement etme işlemimiz bu kadar. Artık web projemiz bir kere ayağa kalktıktan sonra set ettiğimiz değerler doğrultusunda çalışacaktır.

Quartz schedular işlemler için .Net tarafında kullanılabilecek en yaygın kütüphanelerden bir tanesidir. Örnekte her ne kadar az kullanmış olsak da trigger time özelliğiyle ilgili kullanıcılara bir çok seçenek sunmakta. Bunlarla ilgili ayrıntılı bilgiyi bu linkte bulabilirsiniz.

Comments (11) -

  • Sade ve anlaşılır bir yazı olmuş emeğinize sağlık Smile
  • Merhabalar; konu hakkında bir şey danışacağım. Job içerisinde yapılması gereken işlemleri yazdım, Job çalışmaya başladığında 3 saniyede bir json datayı alıp bir liste tipinde class'ın içerisine dolduruyor. Scheduler 24 saatte bir çalışsın istiyorum, Scheduler durduğunda liste tipindeki classı boşalmak için gerekli kodu nereye yazsam doğru olur ?
    • Merhaba, biraz daha ayrıntılı anlatabilir misiniz ? Kod parçası vs. de paylaşabilirsiniz .
  • Merhabalar,
    Kodu yazdım hiç problem almadan derleyebildim. Kodu test etmek için kendi IIS ime api projesini ekledim. Job 1 dakika sonra çalışacak şekilde gerekli düzenlemeleri yaptım. Ancak IIS te tanımlamalar yaptıktan sonra api yi tarayıcı da açtıktan 1 dakika sonra program güvenlik izinleri olmadan başlatıldı gibi bir hata alıyorum. Bunu kendi localimde test edebilir miyim? Edebilirsem IIS üzerinde veya config dosyasında tanımlamam gereken herhangi bir ayar var mıdır? Teşekkürler
  • Merhaba,

    Bu ürün siteye birisi girmese bile tetikleme yapıyor mu? Yoksa çalışması için birisinin mutlaka web sitesine girmesi gerekiyor mu ? Bu konuda bilgi verebilir misiniz?
    • Merhaba, job'ları olusturduktan sonra uygulama ilk defa ayaga kalkarken senın belirttiğin time'a göre otomatik schedule olur. Yani her gün saat 01:00 da çalışacak bir job yazdın diyelim uygulamayı deploy edip ilk startup'ta schedule olacaktır ve her gün saat 01:00 da otomatik tetiklenecektir tekrar tekrar siteye girip manuel olarak schedule etmeye gerek yok.
  • Merhaba, Global.asax da çalıştırdığım kodda Bir Application["x"] oluşturuyorum ve bu listenin günde iki defa belirlediğim saatlerde güncellenmesi gerekiyor.  Quartz ilk defa kullanıyorum. Normalde direkt   Application["x"]  atayabiliyorsun ama Quartz olduğunda nasıl atanacağını çözemedim. Yardımcı olursanız sevinirim.
    • Merhaba, Application["x"]'den kastın tam olarak nedir ?
  • Mrb örnek kod paylaşabilir misin ?

Add comment