Merhaba arkadaşlar, bugün Quartz kütüphanesinden bahsederek bir örnek yapacağız.
Quartz nedir?
Quartz, .Net ortamında belirli zamanlarda ve periyotlarda belirlediğiniz aksiyonların alınmasını sağlayan açık-kaynak bir kütüphanedir.
Kendi tanımlamalarıyla “Open-source job scheduling system for .NET” .

Neden İhtiyaç Duyarız?
Yazdığım yazılarda, hangi senaryolarda yazı konusunu kullanabiliriz gibi konulardan bahsetmeyi seviyorum. Quartz için de kullanım amacına değinmek istiyorum.
Örneğin dakika da bir ekrana saati yazan bir uygulamamız olsun. Burada her dakika bu işlemi manuel yönetmek yerine bunu bir joba bağlayarak ve Quartz aracılığıyla da çalışma sıklığını belirterek işin içinden kolayca çıkabiliriz. Yani belirli aralıklarda sürekli olarak yapacağımız işlemler için kullanabiliriz.
Bu arada bu iş için tabii ki Quartz kullanmak şart değildir. Yeni bir uygulama yazarak Windows task scheduler dan taskımızı ayarlayarak da bu işlemi yapabiliriz.
Fakat hem büyük sistemlerde entegre bir şekilde çalışması, hem büyük bir projede bu iş parçacığının yeniden yazılması eforunu gerektirmemesi hem de periyotlarda sağladığı esneklik sayesinde senaryolara göre tercih sebebi olabilir.

Örneğimize başlayalım;
Ben yukarıda belirttiğim “dakikada bir çalışarak saati yazdıran uygulamayı örnek olarak yapacağım.
Örneğin sade ve basit olması için console uygulaması olarak yazacağım. Fakat farklı platformlarda da Quartz kullanabilir, Dependency Injection yapınıza dahil edebilirsiniz.
Bu örnekte VsCode, .Net Core 3.1 ve Quartz.Net (Version 3.2.2) kullanacağım.
dotnet new console //.Net Core Console uygulamamızı oluşturalım. code . //Klasörümüzü VsCode içerisinde açalım.
Quartz.Net paketimizi Nuget Pacage Manager aracılığıyla yada terminal aracılığıyla projemize dahil edelim.
dotnet add package Quartz — version 3.2.2
using System; using System.Threading.Tasks; using Quartz; public class ShowDateTimeJob : IJob { public Task Execute(IJobExecutionContext context) { var now = DateTime.Now.ToString("HH : mm : ss"); Console.WriteLine($" Merhaba, saat şuan {now}"); return Task.CompletedTask; } }
ShowDateTimeJob sınıfımızı oluşturarak IJob interfacinden kalıtım alıyoruz ve bunun bir job olduğunu bildiriyoruz. Execute komutu içerisinde ise alınmasını istediğimiz aksiyonumuzu belirtiyoruz.
using Quartz; using Quartz.Impl; public static class SchedulerHelper { public static async void SchedulerSetup() { var _scheduler = await new StdSchedulerFactory().GetScheduler(); await _scheduler.Start(); var showDateTimeJob = JobBuilder.Create<ShowDateTimeJob>() .WithIdentity("ShowDateTimeJob") .Build(); var trigger = TriggerBuilder.Create() .WithIdentity("ShowDateTimeJob") .StartNow() .WithSimpleSchedule(builder => builder.WithIntervalInMinutes(1).RepeatForever()) //.WithCronSchedule("*/1 * * * *") .Build(); var result = await _scheduler.ScheduleJob(showDateTimeJob, trigger); } }
SchedulerSetup sınıfı içerisinde, schedulerımızı üreterek çalışmasını istediğimiz jobımızı konfigurasyonlarıyla birlikte belirtiyoruz.
Burada StartNow ile jobımızın hemen başlayacağını ve Quartz kütüphanesinden faydalanarak Simple Schedule ile periyodumuzu (dakikada bir) belirtiyoruz. Buna alternatif olarak Cron Scheduler da kullanılabilir. Simple Schedule konfigurasyonu daha okunabilir olduğu için bunu tercih ettim.
Commentte belirtilen Cron Scheduler aynı görevi yapmaktadır. Şimdi Main fonkisyonumuzda SchedulerSetup metodumuzu çağıralım ve çıktımıza bakalım.
using System; namespace QuartzNetCore { class Program { static void Main(string[] args) { SchedulerHelper.SchedulerSetup(); Console.ReadLine(); } } }
dotnet run
Ekran görüntüsünde de görüldüğü gibi 1’er dakika arayla ekrana saati yazdıran uygulamamızı Quartz kütüphanesinden faydalanarak oluşturduk. Umarım faydalı olmuştur.
Kaynak Kod => https://github.com/EnesAys/QuartzNetCore
Kaynaklar
https://www.quartz-scheduler.net/documentation/quartz-3.x/packages/aspnet-core-integration.html#installation
https://github.com/quartznet/quartznet
https://blog.vfrz.fr/quartz-asp-net-core-3-0/
http://www.canertosuner.com/post/quartz-net-nedir-nasil-kullanilir1