2 Eylül 2023 Cumartesi

Asp.Net Core’da Hangfire Kullanımı

 

Asp.Net Core’da Hangfire Kullanımı

Hangfire, Asp.Net Core uygulamalarında zamanlanmış görevleri yönetmek için kullanılan bir araçtır. Hangfire, uygulamanın arkasında çalışan bir job süreci oluşturarak, zamanlanmış görevleri güvenilir bir şekilde yürütür.

Hangfire’ı kullanmak için, öncelikle uygulamanıza Hangfire paketini yüklemeniz gerekmektedir. Bunun için, NuGet Paket Yöneticisi’ni kullanabilirsiniz. Ayrıca, Hangfire’ı kullanmak için bir veritabanı seçmeniz gerekmektedir. Hangfire, desteklediği birçok veritabanı sunucuları arasında SQL Server, PostgreSQL, MySQL, Oracle, Redis ve MongoDB’yi sayabiliriz.

Program sunucuda çalışırken arka planda belli kurallara göre ve belli zamanlarda yapılmasını istediğimiz işler için inanılmaz bir çözüm. Web arayüzü ile baya kullanışlı bir yardımcı kütüphanedir. Sahip olduğu dashboard ile job’larınızı tarihsel olarak görüntüleyebilir, start-stop/restart gibi işlemler yapabiliriz.

Öncelikle local Db’de HangFire adında bir database oluşturalım. Database’in user login bilgilerini ayarlıyoruz.

 

 

Şimdide TaskWithHangFire adında bir web api projesi açıyoruz. Nuget üzerinden bugün için en güncel olan Hangfire paketini projemize ekliyoruz.

 

 

Oluşturduğumuz database’in connection string’ini application.json dosyasına ekliyoruz. 


1
2
"HangfireDbConn": "Server=DESKTOP-FRC4TQU\SQLEXPRESS;Initial Catalog=HangFire;Persist Security Info=False;User ID=HangFireUser;
 Password=123456;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;"

 

Hangfire’ı uygulamaya tanıtmamız gerekiyor. Bu kısımda Startup.cs de bulunan ConfigureServices metodu içerisinde Hangfire’ı service olarak ekleyelim ve sonrasında Configure metodu içerisinde bu servisi kullanacağımızı belirten kod bloklarını yazıyoruz.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddHangfire(_ => _.UseSqlServerStorage(Configuration.GetValue<string>("HangfireDbConn")));
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
           // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }
        app.UseHangfireDashboard();
        app.UseHangfireServer(); 
        app.UseHttpsRedirection();
        app.UseMvc();
}

 

Yukarıdaki kod bloğunda hangfire database bilgisini vererek uygulamamız servislerine register ettik. Devamında da hangfire’ın server ve dashboard servislerini kullanacağımızı belirttik.

Hangfire dashboard default olarak uygulamanın çalıştığı portta’ http://hangfire adresinde host edilir. Bizde localhost’ta çalıştığımızdan uygulamayı run edip browser üzerinden http://localhost/hangfire adresine gittiğimizde aşağıdaki gibi hangfire dashboard’u görüntüleyebiliriz.

 

 

Uygulama start edildiğinde database’de gerekli tablolar oluşturulmuş mu ? kontrol ediyoruz.

 

 

 

Hangfire konfigurasyonunu tamamladık şimdi sırasıyla Hangfire kütüphanesinde bulunan BackgroundJob sınıfını kullanarak oluşturabileceğimiz job türlerine bakacak olursak;

 

1- Fire-and-Forget Jobs

Job create edildikten sonra çalışır ve process olur. Bir daha da çalışmaz. Tek kullanımlık bir job’tır.  


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
namespace TaskWithHangFire.Jobs
{
    public class FireAndForgetJob
    {
        public FireAndForgetJob()
        {
            // Fire and forget
            var jobId = BackgroundJob.Enqueue(()=>ProcessFireAndForgetJob());            
        }
        public void ProcessFireAndForgetJob()
        {
            //to do jobs
            throw new NotImplementedException();
        }
    }
}

 

2- Delayed Jobs

Belli bir zaman bilgisi set edilerek sadece bir kez çalışmasını istediğimiz task’lar için kullanabileceğimiz job türü. Aşağıdaki gibi Job register olduktan 4 dakika sonra çalışacaktır.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
namespace TaskWithHangFire.Jobs
{
    public class DelayedJob
    {
        public DelayedJob()
        {
            // Delayed Jobs
            var jobId = BackgroundJob.Schedule(()=>ProcessDelayedJob(),TimeSpan.FromMinutes(4));
        }
        public void ProcessDelayedJob()
        {
            Console.WriteLine("");
        }
    }
}

 

3- Recurring Jobs

Recurring yani tekrar eden task’lar için kullanılan job türü. Örneğin; her saat başı çalışmasını istediğiniz bir job’a ihtiyacınız olduğunda aşağıdaki gibi tanımlayabiliriz.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
namespace TaskWithHangFire.Jobs
{
    public class Recurring_Job
    {
        public Recurring_Job()
        {
            //Recurring job
            RecurringJob.AddOrUpdate(() => ProcessRecurringJob(), Cron.Hourly);
        }
        public void ProcessRecurringJob()
        {
            Console.WriteLine("I am a Recurring Job !!");
        }
    }
}

 

4- Continuations Jobs

Parent-child ilişkisinin olduğu yani bir job’ın çalışması için başka bir job’ın tamamlanmasını bekleyip bittikten sonra çalışmasını istediğimiz işler için kullanabileceğimiz job türü.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
namespace TaskWithHangFire.Jobs
{
    public class ContinuationsJob
    {
        [Obsolete]
        public ContinuationsJob()
        {
            //Delayed job
            var parentJobId = BackgroundJob.Schedule(() => Console.WriteLine("I am a Delayed Job !!"), TimeSpan.FromMinutes(4));
            //Continuations job
            BackgroundJob.ContinueWith(parentJobId,() => ProcessContinuationsJob());
        }
        public void ProcessContinuationsJob()
        {
            Console.WriteLine("I am a Recurring Job !!");
        }
    }
}

 

Uygulamanızda çalıştırmanız gereken arka plan işleri için Hangfire implementasyonunu hızlı bir şekilde yapıp dashboard’u ile birlikte kolayca kullanabilirsiniz. Hangfire’ın muadili olan Quartz.net veya bir queue çözümü de kullanarak işlemlerinizi yapabilirsiniz. Umarım faydalı olmuştur.

 

Yararlanılan kaynaklar

Kaynak Kodu

http://www.canertosuner.com/post/asp-net-core-hangfire-ile-birlikte-background-task-islemleri 

 

Hiç yorum yok:

Yorum Gönder

.Net Core'da Swagger UI Kullanımı

  Web API geliştirirken API de yazılan metodların ne iş yaptığı? Hangi parametreleri aldığı? Ne cevap döndüğü? Gibi bilgilerin yer aldığı ...