Hasan Akpürüm
Kıdemli Yazılım Danışmanı
Makele Detayı

Jobnium Açık Kaynak .Net Core WorkerService - HostedServise

22.10.2020 12:53:46

Merhaba arkadaşlar,

Geçen sene yazmış olduğum makalemde .net core 2.x versiyonları için Hosted Servisi nasıl kullanacağımızı anlatmıştım.

Bunun üzerinde bu servisleri nasıl yönetilebilir hale getiririz? getirebilir miyiz? tarzında çok fazla sorular olmuştu.

Açık kaynak olarak yayınlamaya karar verdiğim .net core üzerinde HostedServisleri nasıl dinamikleştirebildiğimizi anlatmaya çalışacağım.

Aslında bu servis yapısı .Net Core 2.1 den beri HostedService olarak projeye Register edilerek kullanılabilmekteydi. 3.0 sürümü ile beraber bir çatı altında toplanmış oldu ve artık Worker Servis projesi olarak console uygulaması geliştirme imkânımız oldu.

Bu projenin sadece sizlerin ihtiyacınıza yarayacak kütüphane kısmını paylaşacağım ve projenizde nasıl kullanırsınız anlatmaya çalışacağım.

Hazırlamış olduğum kütüphane .net core 2.0 2.1 2.2 3.0 ve 3.1 de çalışacak şekilde hazırlanmıştır.

Projenin herkeste çalışabilir olması ve anlaşıla bilirliğin kolay olması için Sqlite veri tabanı ve Entity Framework kullandım.

İki adet tablomuz bulunmakta. JobTable ve JobLog.

JobTable  : Çalışacak olan görevlerimi yönettiğimiz tablodur. Görevimizin kaç sn. de bir çalışacağını ve aktif pasifliğini tutar.

JobLog  : Çalışan görevlerimizin Başlangıç tarihini, ne kadar sürdüğünü, işlem bitimindeki mesajını ve işlem durumunu tutar. (Not : Bu bu tabloyu redis üzerinde tutmanız daha doğru olacaktır.)

Kütüphanemizi detaylıca inceleyecek olursak,

 

Abastract  klasörümüzün içinde JobLogStatus ve StaticValues sınıflarımız bulunmakta.

JobLogStatus  : Görevlerimizin durumlarını belirttiğimiz enum değerleridir.

StaticValues  : Static olarak belirlediğimiz değişkenlerimizi tutarız. Burada veri tabanı yolunu tutmak için bir değişken kullanmıştır.

IJob  : Çalışmasını istediğimiz tüm görevlerimize bu interface implemente edilmedilir. ServiceCollection listedine reflection ile register edilirken sınıftaki bu interface’in varlığına bakmaktadır.

HostedService : Bu sınıfımız abstract bir sınıf olup IHostedServiceIDisposable  implemente edilmiştir. Abstract olmasının sebebi bir sonraki anlatacağım sınıfta base olarak kullanılacaktır. Override edilebilir tane methodumuz bulunmakta. Biz ExecuteAsync ve StopAsync metodlarını bir sonraki sınıfımızda Override ederek kullanacağız.

Base Job  : Çalışmasını istediğimiz tüm görevlerimiz BaseJob sınıfından türemelidir. Run isminde Abstract metodumuz bulunmaktadır. Bu metodumuzu yazacağımız görevlerde override ederek kullanıp oradaki işlemlerimizin BaseJob sınıfımızın ExecuteAsync methodu içinde kullanılmasını sağlayacağız.

 

 

runSecond : görevimizin default olarak kaç saniyede bir çalışacağını belirtir. Sonrasında görev adımız ile JobTable tablosuna sorgu atılır ve buradaki görevimizin durumu aktif ise ne kadar sürede bir çalıştırılacağı verisi çekilerek değişkenimize set edilir.

Try catch  bloğumuzun içini inceleyelim,

Süreki  tutmak için StopWatch başlatılır. JobLog tablomuza servisin durumu çalışıyor olacak şekilde bir insert işlemi yapılır. Sonrasında kendi servisimizden override edilmiş method çağırılır. İşlem bittiğinde ise stopwatch durdulur ve insert ettiğimiz veri güncellenir.

(Not tabloya önce insert sonra update edilmesinin sebebi şudur aslında. Jobları izlediğimiz burda olmayan bir managament ekranımız var burada anlık olarak hangisi devam ediyor hangisi bitti görebiliyoruz. Tavsiyem burada redis yada nosql veritabanları kullanmanızdır. Sqlite sadece anlatım için kullanılmıştır. )

 

StopAsync  : Bu methodumuz WorkerServisimiz tamamen stop edildiğinde devreye girer ve o anda çalışan servisler varsa hepsinin durumunu durduruldu olarak günceller. Bu sayede yarım kalan servisinizi görmüş olursunuz. (Not : Buradaki kullanımıda birebir kullanmayın kendi mantığınıza göre değiştirin. Aksi taktirde JobLog tablosu büyüdüğünde ya da çok fazla servisiniz olduğunda liste çekerek update etmek çok mantıklı bir yaklaşım olmayacaktır.)

Denemek için bir tane WorkerService projesi açalım. Ve Jobnium kütüphanesini referanslarımıza ekleyelim.

Daha sonra Program.cs dosyamızı aşağıdaki gibi değiştirelim.

AddJobs  genişletilmiş method bizden assembly adı ve sqlite veritabanının bulunduğu klasör yolunu ister. Sonrasında bu assembly ye bağlı IJob implemente edilmiş tüm sınıfları reflection yöntemi ile bularak Servis Koleksiyonumuza register eder.

ScheduleServices  klasörümüzün altına Sms gönderme işlemi yapacak bir görev ekleyelim.

Sonrasında ihtiyacımız olan jobları ekleyelim. Her şey tamam artık projeminizi çalıştırabiliriz.

Umarım faydalı bir makale olmuştur.

Projenin Github linkine buradan ulaşabilirsiniz.

https://github.com/hakpurum/Jobnium

Yorum yaz

Thanks, your message is sent successfully.