icon Blog

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.

1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
4
5
6
7
8
9
10
11
12
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using Quartz;
using Quartz.Impl;
using System;
 
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using QuartzNetTest.Scheduling;
using System.Web.Mvc;
using System.Web.Routing;
 
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.


Yorumlar (0)



Yorum Yaz