C# MVC’de Quartz.Net ile Zamanlanmış Görev Hazırlama

13.10.2016 13:23:00 (6217 Kez okundu)

C# MVC ile istediğimiz aralıklarla zamanlanmış görevler oluşturmak için Quartz.Net in inceliklerini öğrenelim.

Merhaba arkadaşlar,

Çok kısa bir zaman aradan sonra yine sizlere yapmış olduğum işlerde işime yarayan uygulamalardan faydalanmanız için yazıyorum.

İlgili Site : http://www.quartz-scheduler.net/
Nuget Sayfası : https://www.nuget.org/packages/quartz/

Malzemeler;

1) İlgili Proje

2) Quartz.Net (Şu anda stabil versiyon 2.4.1, Alpha 3 çıktı.) 2.4.1'i kullanacağız.

İlgili Projeyi açıyoruz.

Quartz.Net'i isterseniz Nuget Konsol'a 

PM > Install-Package Quartz -Version 2.4.1

yazarak,

Dilersenizde Nuget Manager'da aratarak yükleyebilirsiniz.

Nuget Konsola giriş;

Nuget Manager'a giriş;

Nuget Manager'dan Görüntü;

Bu kadar bilgiden sonra kodlarımıza geçiş yapalım;

Bir tane ScheduledTasks adında class dosyası oluşturun ve içeriğini aşağıdaki gibi düzenleyin.

Ben Helpers içerisinde oluşturdum. Nerede oluşturacağınızın bir önemi yok.

Önemli olan referansımız using Quartz; ekli olsun.

using Quartz;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using Projem.Controllers;
using Projem.Models;

namespace Projem.Helpers
{
    public class ScheduledTasks : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            string ServerMapPath = context.JobDetail.JobDataMap.GetString("HttpContext");
            IntegrationController.ScheduleProccess(ServerMapPath);
        }
    }
}

Burada ServerMapPath değerini bana gerektiği için aldım.

Nedenide şu, ben zamanlanmış görevde public void çalıştırıyorum. Public void httpcontext.current değerini alamıyor.

Bu nedenle servermappath değerini string olarak buradan alıp void içerisinde kullanıyorum.

 

Şimdi Trigger yani Sahte Tıklama olayını oluşturalım.

Trigger bizim istediğim değerlere bağlı kalarak ScheduledTasks taki Execute komutunu çalıştıracak.

Yine bir class oluşturalım adını ScheduledTrigger koyalım.

Bu class içerisinde programlamamızı yapalım.

Quartz gelişmiş seçeneklere bağlı. Fazla ayrıntı veremeyeceğim, kullandığım zamanlama mantığını anlatacağım.

using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;

namespace Vandalina.Helpers
{
    public class ScheduledTrigger
    {
        public void Main(System.Web.HttpContext HttpContext)
        {
            try
            {
                // Fabrikayı açıyoruz.
                ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
                // Fabrikamızda yeni Schedule (Zamanlayıcı) oluşturuyoruz.
                IScheduler scheduler = schedulerFactory.GetScheduler();
                // Bu zamanlayıcıyı çalıştırıyoruz.
                scheduler.Start();

                // Görevi oluşturup programlıyoruz.
                IJobDetail job = JobBuilder.Create<ScheduledTasks>()
                .UsingJobData("HttpContext", HttpContext.Current.Server.MapPath("")) // Bana lazım olan ServerMapPath değerini JobData içerisine gömüyoruz.
                .WithIdentity("ScheduledTasks", "excgroup") // Burada çalıştırılacak olayımızın adını giriyoruz. <strong>ScheduledTasks == </strong>İlk oluşturduğumuz class ın adı. Burada grup adı var, kullanmadığım için bilmiyorum. İnternetteki makalelerde genel olarak null değer göndermişler.
                .Build(); // Job(Görev)'i inşa ettik.

                // Trigger (Sahte Tıklama) olayını ayarlıyoruz.
                ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                .WithIdentity("ScheduledTasks", "excgroup") // Aynı şekilde çalıştırılacak olayımızın adını giriyoruz.
                .WithCronSchedule("0 0/1 * * * ?") // Zamanlamayı ayarlıyoruz. Aşağıda detaylı anlatacağım.
                .Build(); // Trigger olayını aktif ediyoruz.
                scheduler.ScheduleJob(job, trigger); // Job ile Trigger ı bir biri ile eşleştiriyoruz.
            }
            catch (SchedulerException se)
            {
                // burada dönen hataları DB veya not defterine kaydederseniz alınan hataları görebilir ve çözüm arayabilirsiniz.
            }
        }
    }
}

Ben burada ICronTrigger zamanlama mantığını kullandım.

Yukarıda satırlarda yorum satırı olarak ayrı ayrı anlattım.

Şimdi birazda zaman belirleme hakkında bilgi vereyim.

Yukarıdaki kod ile buradaki kod arasında bir * farkı var. soru işaretinden sonra bir yıldız daha ekledim. Sondaki değer Yıl'ı ifade eder.

WithCronSchedule("0 0/1 * * * ? *")

Burada her değer bir boşluk ile ayrılıyor. Bunları sırayla gözden geçirelim.

1) Saniye = 0-59
2) Dakika = 0-59
3) Saat = 0-23
4) Ay için Gün = 0-31
5) Ay (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV ve DEC)
6) Hafta için Gün (SUN, MON, TUE, WED, THU, FRI ve SAT)
7) Yıl

* (yıldız) anlamı; O alan için geçerli bir değer verilmeyecek, her olasılık kabul edilecektir.Öncelikle şunu belirteyim;

? (soru işareti) anlamı; 4üncü (Day-of-Month / Ay için Gün) ve 6ıncı (Day-of-Week / Hafta için Gün) alanları için kullanılır. Geçerli bir değer tanımlanmadığında kullanılır.

Birkaç örnek vereyim;Son olarak Global.asax ta Schedule mızı oluşturalım.

// Bu kod ile 5 dakika da bir işlem çalışır.
// Buradaki 0/5 'in anlamı. 0 dan bağla ve her 5 dakika da bir çalış.
WithCronSchedule("0 0/5 * * * ? *")

// Bir diğer tanımla 5. dakikada başla 15 dakika da bir tekrarla.
WithCronSchedule("0 5/15 * * * ? *")

// Bu kod ile her saatin 5. dakikasında çalışır. Dikkat ederseniz 2. alandaki 0/5 veya 5/15 yerine sadece 5 yazdım. 
WithCronSchedule("0 5 * * * ? *")

// Burada 8-12 saatleri arasında 30uncu dakikada çalıştır.
// Yani 8:30, 9:30, 10:30, 11:30, 12:30 saatlerinde çalışacak.
WithCronSchedule("0 30 8-12 * * ? *")

// Daha detaylı bir örnekle son veriyorum.
// Her yıl, Ocak, Şubat, Mart, Nisan, Mayıs (JAN-MAY) aylarında, Pazartesi, Çarşamba, Cuma (SUN,TUE,FRI) günlerinde, ayın 2,5,6,7,8,9,10 günlerinde saat 12'de çalıştır.
WithCronSchedule("0 0 12 2,5-10 JAN-MAY SUN,TUE,FRI *")

Ben Helpers içine yazdığım için referansımız oluyor.

Helpers.ScheduledTrigger scheduler = new Helpers.ScheduledTrigger();
scheduler.Main(System.Web.HttpContext.Current); // Buradaki değer sayesinde bana lazım olan servermappath değerini alıyorum.

Bu yazımızında sonuna gelmiş bulunuyoruz.

İşime yarayan ve yararlanmanızı istediğim diğer konularda görüşmek üzere.

Sorunuz olursa yorum alanını kullanmaktan çekinmeyin.

Yorumlar

Ortalama

Henüz değerlendirilmemiş.
Henüz yorum yapılmamış.
İlk yorumu siz yapın.

Bir Yorum Yaz