Asp.NET Core’da Hangfire Kütüphanesi İle Zamanlanmış Görevler Oluşturma

Merhaba,

Bu içeriğimizde; Asp.NET Core uygulamalarında Background Jobs(Arka plan İşleri) gerçekleştirebilmek için bir açık kaynak kütüphanesi olan Hangfire’i inceliyor olacağız. Hangfire; çok yabancı olmadığımız ve zamanında hakkında detaylı makale yazdığımız Quartz.Net kütüphanesinin güzel bir muadilidir diyebiliriz.

Background Jobs Nedir?

Arka plan işleri olarak nitelendirilen Background Jobs aslında zamanlanmış görevlerin ta kendisidir. Bazen uygulamalarımızın ana thread dışında bir task işlemesi yahut senaryo gereği belli aralıklarla belli işlemlerin gerçekleştirilmesi gerekebilmektedir. İşte bu tarz ihtiyaçlara istinaden gerçekleştirilen zamanlanmış görevleri background jobs diyerek tarif etmekteyiz.

Hangfire’ın Avantajları Nelerdir?

  • Oldukça kolay kullanıma ve yönetilebilirliğe sahiptir.
  • Hangfire, veritabanı ile otomatik entegrasyon sağladığı için tanımlanan işlere ait tüm kayıtları fiziksel olarak tutmaktadır. Dolayısıyla bir iş tam teferruatıyla tamamlanmadan geçilmeyecek, süreçteki olası hatalarla karşılaşılma durumunda iş tekrardan çalıştırılacak ve işe dair son noktayı koymaksızın bu süreç böyle devam edecektir. Dolayısıyla fiziksel kayıt söz konusu olduğundan dolayı iş güvenliği hat safhada sunulmaktadır.

Hangfire Nasıl Çalışır? Mimarisi Nasıldır?

Asp.NET Core’da Hangfire Kütüphanesi İle Zamanlanmış Görevler Oluşturma
Hangfire; clienttan alınan görevleri “Hangfire Job Storage(Hangfire İş Deposu)” isimli alanda depolayarak sıraya alır. Server tarafından ilgili depodaki işler sırasıyla tek tek alınarak arka planda işlenir ve sonuç olarak clienta haber gönderir.

Projeye Hangfire Entegrasyonu

Asp.NET Core projesine Hangfire’ı entegre edebilmek için ilgili projenin ana dizinine odaklanmış powershell ekranında aşağıdaki komutu çalıştırmanız yeterli olacaktır.
Asp.NET Core’da Hangfire Kütüphanesi İle Zamanlanmış Görevler Oluşturma

dotnet add package Hangfire

Bu işlemden sonra Hangfire kütüphanesi projeye entegre edilmiş olacaktır.

Hangfire Kurulumu

Entegre ettiğimiz Hangfire kütüphanesini Asp.NET Core projesinde aktif hale getirebilmek için ilk olarak Hangfire’ın kullanacağı veritanını oluşturmamız gerekmektedir.
Asp.NET Core’da Hangfire Kütüphanesi İle Zamanlanmış Görevler Oluşturma

Hangfire; arka planda gerçekleşecek olan işleri sıralı bir şekilde kayda almak ve sonuçlarını takip edebilmek için fiziksel olarak bu veritabanını kullanacaktır. Uygulama ilk ayağa kalktığında Hangfire yapılanması ilgili veritabanında kendisine ait tabloların var olup olmadığını check etmekte, eğer yoksa anında migrate etmektedir. Evet, zaten birazdan bu durumuda gözlemleyeceğiz 🙂

Sıra veritabanı providerını “appsettings.json” dosyasına eklemeye geldi.

{
  "ConnectionString": "Server=.;Database=HangfireDB;Trusted_Connection=True;"
}

Bu işlemden sonra Hangfire kütüphanesini servis olarak uygulamaya dahil etmek ve nimetlerinden faydalanabilmek için “Startup.cs” dosyasında aşağıdaki çalışmaları gerçekleştirelim.

    public class Startup
    {
        public IConfiguration Configuration { get; set; }
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddHangfire(_ => _.UseSqlServerStorage(Configuration.GetValue<string>("ConnectionString")));
            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
                app.UseDeveloperExceptionPage();

            app.UseHangfireDashboard();
            app.UseHangfireServer();

            app.UseMvc(_ => _.MapRoute(
                name: "Default",
                template: "{controller=Home}/{action=Index}/{id?}"
                ));
        }
    }

Yukarıdaki kod bloğunu incelerseniz eğer;
“ConfigureServices” metodunda “AddHangfire” fonksiyonu ile Hangfire kütüphanesinin kullanacağı SQL Server Storage’ini belirlemekteyiz. “Configure” metodunda ise “UseHangfireDashboard” ve “UseHangfireServer” middlewarelerini devreye sokarak Hangfire kütüphanesinin Dashboard özelliğiyle birlikte Hangfire Server’ı uygulamada kullanılabilir hale getiriyoruz.

Hangfire dashboard’unda neler var? sorunuzu duyar gibiyim… Bir kaç satır sonra dashboard yapısını inceleyeceğiz lakin şimdi bu noktaya kadar yaptığımız çalışmayı ayağa kaldırarak Hangfire kütüphanesinin tablolarının migrate edildiğini ve temel yapılanmasının sıkıntısız aktifleştirildiğini göstermek istiyorum.
Asp.NET Core’da Hangfire Kütüphanesi İle Zamanlanmış Görevler Oluşturma
Yukarıdaki ekran görüntüsünde olduğu gibi Hangfire yapacağı işleri fiziksel olarak tutacağı tüm veritabanı yapılanmasını otomatik migrate etmiş bulunmaktadır. Burada önceki satırlarda bahsettiğim durumu tekrarlamak istiyorum ki; ilgili tablolar silindiği taktirde bir sonraki uygulamanın ayağa kalkması durumunda, check sonucunda tekrardan migrate edileceklerdir.

Hangfire Dashboard Yapısı

Asp.NET Core’da Hangfire Kütüphanesi İle Zamanlanmış Görevler Oluşturma

  • Jobs
    Sürece dahil olan tüm işlemleri durumlarıyla birlikte takip edebildiğimiz sekmedir;

    • Enqueued, sıradaki işleri
    • Scheduled, ileri tarihe ayarlanmış işleri
    • Processing, o anda işlemde olan/çalışan işleri
    • Succeeded, başarılı bir şekilde tamamlanmış işleri
    • Failed, başarısız olmuş işleri
    • Deleted, silinmiş işleri
    • Awaiting, sırasını bekleyen işleri

    gösterir.

  • Retries
    Tanımlanmış işlerden olası hatalar sonucu tekrara düşenleri gördüğümüz sekmedir. Bir işin kaçıncı kez tekrara girdiği görülebilir. Varsayılan olarak tekrar sayısı 10’dur.
  • Recurring Jobs
    Tekrarlı tanımlanmış işlerin görüldüğü sekmedir. Her ne kadar ayarlanmış tekrar söz konusu olsada Trigger ile istenildiği an tetiklenebilir.
  • Servers
    Kullanılan Hangfire sunucularını görebildiğimiz sekmedir.

Görev Oluşturma

Hangfire ile dört farklı aksiyonda görev oluşturulabilmektedir. Şimdi gelin bu aksiyonları tek tek inceleyelim;

  • Fire-And-Forget Jobs
    İş tanımlanır ve hemen ardından bir kereye mahsus tetiklenir.

     Hangfire.BackgroundJob.Enqueue(() => Console.WriteLine("Fire-And-Forget Jobs tetiklendi"));
    

  • Recurring Jobs
    Belirlenen CRON zamanlamasına göre tekrarlanan işler tanımlanır.

     Hangfire.RecurringJob.AddOrUpdate(() => Console.WriteLine("Recurring jobs tetiklendi!"), Hangfire.Cron.MinuteInterval(1));
    
  • Delayed Jobs
    Oluşturulduktan belirli bir zaman sonra sadece bir seferliğine tetiklenecek olan görevler tanımlanır.

     Hangfire.BackgroundJob.Schedule(() => Console.WriteLine("Delayed jobs tetiklendi!"), TimeSpan.FromSeconds(10));
    

    Örneğin, yukarıdaki kod bloğundaki görev register edildikten 10 saniye sonra tetiklenecektir.
    Asp.NET Core’da Hangfire Kütüphanesi İle Zamanlanmış Görevler Oluşturma

  • Continuations
    Birbiriyle ilişkili işlerin olduğu durumlarda alınan aksiyondur. Bir jobun tetiklenebilmesi için bir öncekinin tamamlanması gerekmektedir.

     var parentJobId = Hangfire.BackgroundJob.Schedule(() => Console.WriteLine("1. Job"), TimeSpan.FromSeconds(10));
     //Continuations job
     Hangfire.BackgroundJob.ContinueWith(parentJobId, () => Console.WriteLine("2. Job"));
    

    Asp.NET Core’da Hangfire Kütüphanesi İle Zamanlanmış Görevler Oluşturma

Evet… Bu noktadan itibaren Asp.NET Core uygulamalarında zamanlanmış görevlerin Hangfire ile tam teferruatlı nasıl gerçekleştirilebileceğini incelemiş bulunmaktayız. İlgilenenlerin faydalanması dileğiyle…

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir