Tayfun Bolat
SDTR
Published in
4 min readMay 30, 2020

--

Quartz

Merhabalar,

Bu yazımda Zamanlanmış işler için C# programla dili ile geliştirilmiş open source kütüphane olan Quartz.NET üzerine birşeyler yazmak istedim.

Zamanlanmış işler(Scheduler Task) sıkça duyduğumuz birçoğumuzun bildiği gibi her hangi bir insan müdahelesi olmadan yapılacak olan zamanı belirlenmiş iş görevini vakti geldiğinde tamamlamasıdır.

Quartz da aslında tam olarak bunu yapıyor. Belirlenmiş iş parçacıklarını hafızası üzerinde tutarak zamanı geldiğinde çalıştırıyor. Bu zaman dilimini cron adında belirlenmiş olan formatda istenilen şekilde istediğimiz zaman dilimini verebilmemizi sağlıyor.

Öncelik olarak bir Job(iş parçacığı) tanımlaması yapılır ve sonrasında bu iş parçacığının Trigger (kim için ve hangi zaman diliminde) çalışacağı set edilir. Bu iki yapı match olduktan sonra Scheduler’ ın context hafızasında koşmaya başlamak için hazır duruma gelirler.

Job ve Trigger yapısı ile ilgili örnek üzerinden açıklayıcı bir bilgi paylaşıp kod üzerinden örneklendirmeye geçebiliriz.

Günün belli saatlerinde müşteri özelinde Mail veya SMS gönderen bir yapınız olduğunu varsayalım bunlar için tanımlanması gereken MailJob ve SMSJob bizim İş parçacıklarımız olacaktır.

Yukarıda bahsettiğimiz belli saatler ve müşteri özeli kısmı Trigger’ı ilgilendiren kısım oluyor. SMS için oluşturulan job için A müşterisine Sabah 09:00 da mail gönderilsin.

Quartz.NET ile özellikle self-hosting servislerinizde ölçeklenebilir performanslı joblar oluşturup bunları yönetebilir ve monitoring edebilirsiniz. Sadece Job tanımlaması yapıp statik olarak bunları tetiklemiyor. Runtime anında çalışan joblara müdahele edebileceğiniz, yeni job ve triggerlar ekleyebileceğiniz methodlarıda size sunuyor. Bunların haricinde kendi bünyesinde bulunan middleware katman yapılarıda sunuyor. Job’ınız veya Trigger’ınız tetiklenmeden önce ve tetiklendikten sonrasına müdahele edebilmenizi veya loglamanızı ekleyebilmeniz için yönetimi tamamen size bırakıyor.

Birazda kodlamaya geçelim…

Basit bir Konsol projesi oluşturup Nuget üzerinden Quartz’ ı yüklüyoruz. Son sürümleri Asenkron alt yapısı sunuyor tercih tabiki size bırakılmış bu noktada.

Normalde örnek projelerde ve bazı kaynaklarda oluşturulan her bir Job için IJob interface’inden türetilip çalıştırılması sağlanır. Fakat ben kuracağımız yapıda reflection kullanarak ortak bir interface belirleyip Runtime anında tek bir ExecuterJob sınıfı oluşturup çalışacak olan Jobları dinamik olarak bu sınıf içerisinden tetikletmeyi hedefliyorum.

Süresi gelen Joblar için tetiklenecek Sınıf ve Method

Quartz içerisinde tanımladığımız her bir Job için Bir IJobDeatil oluşturuyor olacağız.

Bu JobDetail’leri tüketecek olan ise müşteri özelinde oluşturacağımız Trigger’lar olacak.

StdSchedulerFactory üzerinden yeni bir instance oluşturuyoruz. Oluşturulan bu instance üzerinden GetScheduler methodu ile scheduler context içerisindeki iş parçacıklarını elde ediyoruz. Reflection İle joblar için ortak bir arayüz belirlediğimiz ICustomJob interface’ ini implemente etmiş olan SMSJob ve EmailJob sınıflarımızı yakalayabiliyoruz.

Email ve SMS jobı için ortak belirlenen arayüz
EmailJob Sınıfımız
SMSJob Sınıfımız

Yukarıda bahsettiğimiz gibi Her bir Job için(SMS veya Email) bir JobDetail oluşturup AddJob olarak hafızaya insert ediyoruz ve bunu bensersiz olacak isimlendirme(JobKey) ile tanımlamamız gerekiyor.

Jobların Oluşturulması
Triggerların oluşturulması

Projemizi son olarak build edip koşturalım ve Console çıktılarını görelim. Cron olarak hepsine sabit olarak 1 dakika olarak belirledim.

Son olarak Quartz içerisinde middleware ekleyebildiğimizden bahsetmiştik. Bunu bize sağlayanda IJobListener,Bu interface’den ürettiğimiz bir sınıf içerisinde implemente ettiğimiz 3 method bulunuyor.

1-)JobExecutionVetoed : Çalıştırılan Job reddedildiğinde tetiklenen method.

2-)JobToBeExecuted: Job Tetiklenmeden hemen önce çalışan method

3-)JobWasExecuted: Job çalıştırıldıktan sonra tetiklenen method

Projemize Jobları insert ettiğimiz kısıma kodlarımızı ekleyelim

Ve son olarak projemizi tekrar koşturalım ve sonuçları görelim.

Ara katmanımızda görevini başarılı bir şekilde gerçekleştirebiliyor. Böylece Job çalışmadan önce ve sonrasında neler olduğuna dair daha detaylı fikir sahibi olabiliriz.

Quartz.Net hakkında bahsediceklerim şuan için bu kadar. İlerleyen zamanlarda farklı özelliklerine de değinebiliriz. Quartz geniş ve sürekli güncellenen bir kütüphane JobListeners dışında TriggerListeners’de mevcut araştırabilirsiniz. https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/trigger-and-job-listeners.html

Proje için Github link : https://github.com/tayfunbolat/QuartzSimpleProject

Faydalı olabildiysem ne mutlu bana iyi günlerde kalın hoşçakalın..

Tayfun Bolat

--

--