Asp.Net’te Quartz.Net ile zamanlanmış görevler

Çalıştığım bir projede her gün düzenli olarak facebook api’dan data çekiliyor. Bunu periyodik olarak yapabilmek için Quartz.Net kütüphanesini kullanıyoruz. Bu yazıda da basitçe Quartz.Net’in bir mvc projesinde nasıl kullanılacağını anlatmak istiyorum.

Proje kodlarını buradan indirebilirsiniz.

Örnek projemizde 2 farklı görevimiz olsun. Birisinin adına X diğerine Y diyorum. X görevi facebook’dan data çekerken Y görevi ise twitter’dan çeksin.

X görevi uygulama başladığı andan itibaren her 24 saatte 1 defa sonsuza kadar çalışsın.

Y görevi ise uygulama başladıktan 1 gün sonra her yarım saatte 1 defa tekrarlasın ve 10. tekrardan sonra tamamlansın.

Öncelikle için boş bir mvc uygulaması oluşturdum. Daha sonra Nuget ile Quartz.NET kütüphanesini yükledim. Oluşturacağım sınıflar düzenli ve bir arada olsun diye projede Scheduling isminde bir klasör oluşturdum (klasörün adı önemli değil).

İlk iş X görevini tanımlamak; Scheduling klasörüne XScheduler isminde bir sınıf ekliyorum. Sınıfın ismi önemli değil, istersen iz XGorevi adını da verebilirsiniz. Yapmak istediğiniz işleri, çalıştıracağınız kodları Execute metodunun içine yazmalısınız.

using Quartz;
namespace QuartzNetTest.Scheduling {
    public class XScheduler : IJob {
        public void Execute (IJobExecutionContext context) {
            // facebook data çekme işlemleri 
        }
    }
}

Yine Scheduling klasörüne YScheduler isminde bşaka bir sınıf ekliyorum

using Quartz;

namespace QuartzNetTest.Scheduling {
    public class YScheduler : IJob {
        public void Execute (IJobExecutionContext context) {
            //twitter data çekme işlemleri
        }
    }
}

Şimdi de bu taskları çalıştıracak bir wrapper yazıyoruz. Scheduling klasörüne SchedulerWrapper isminde bir class ekliyorum.

using System;
using Quartz;
using Quartz.Impl;

namespace QuartzNetTest.Scheduling {
    public class SchedulerWrapper {
        public void RunJob () {
            try {
                ISchedulerFactory schedFact = new StdSchedulerFactory ();
                IScheduler sched = schedFact.GetScheduler ();
                if (!sched.IsStarted)
                    sched.Start ();

                IJobDetail jobX = JobBuilder.Create<XScheduler> ().WithIdentity ("XScheduler", null).Build ();
                ISimpleTrigger triggerX = (ISimpleTrigger) TriggerBuilder.Create ().WithIdentity ("XScheduler").StartAt (DateTime.UtcNow).WithSimpleSchedule (x => x.WithIntervalInHours (24).RepeatForever ()).Build ();
                sched.ScheduleJob (jobX, triggerX);

                IJobDetail jobY = JobBuilder.Create<YScheduler> ().WithIdentity ("YScheduler", null).Build ();
                ISimpleTrigger triggerY = (ISimpleTrigger) TriggerBuilder.Create ().WithIdentity ("YScheduler").StartAt (DateTime.UtcNow.AddDays (1)).WithSimpleSchedule (x => x.WithIntervalInMinutes (30).WithRepeatCount (10)).Build ();
                sched.ScheduleJob (jobY, triggerY);
            } catch (Exception ex) { }
        }
    }
}

Son olarak task’ları çalıştırmak için Global.asax dosyasını aşağıdaki gibi değiştirdim.

using System.Web.Mvc;
using System.Web.Routing;
using QuartzNetTest.Scheduling;

namespace QuartzNetTest {
    public class MvcApplication : System.Web.HttpApplication {
        protected void Application_Start () {
            AreaRegistration.RegisterAllAreas ();
            RouteConfig.RegisterRoutes (RouteTable.Routes);
            SchedulerWrapper scheduler = new SchedulerWrapper ();
            scheduler.RunJob ();
        }
    }
}

Proje kodlarını buradan indirebilirsiniz.

8 thoughts on “Asp.Net’te Quartz.Net ile zamanlanmış görevler”

  1. şinasi aslan

    yakup bey merhaba;
    ben de tam böyle birşey arıyordum. yanlız her 24 saatte bir çalışan kodu örneğin her gün saat 09:00 ve 19:00 çalıştırmak istiyorum. bunun için nasıl bir kod eklemem gereklidir. şimdiden teşekkür ederim.

    1. bu kod işinize yarayabilir

      var trigger = TriggerBuilder.Create().WithIdentity(“test”, null)
      .WithDailyTimeIntervalSchedule(
      x => x.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(9, 0))
      .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(19, 0))
      .WithIntervalInHours(10))
      .Build();

  2. merhaba yakup bey,

    ben 3-5 adet görev ekleyeceğim fakat bunları farklı zamanlarda çalışmasını istiyorum bu zamanları nasıl öğrenebilirim.

    misal günde 1 defa haftada 2 defa ayda 1 defa vs. vs.

    1. .WithSimpleSchedule(x => x.WithIntervalInHours(24).RepeatForever()) buradaki 24 saat yerine (24×7) saat kullanabilirsiniz.

    1. hayır malesef, hatta IIS’deki Application Pools’da Idle Timout duration’ı 20 dakikanın üstüne çıkarmanı tavsiye ederim. siteye 20 dk içinde giriş yapan olmazsa quartz.net de çalışmayı durduracaktır.

  3. Merhaba,
    Ben TCMB döviz kurlarını sabah 8 ve akşam 23 te çekmek istiyorum.

    Sitede gezinen biri “olmamasına” rağmen bu işlemler çalışyor mu?

    Yani her ne şekilde olursa olsun görev belirtilen zamanda çalışıyor mu?

    IIS in kapalı olması dışında :))

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.