1. Anasayfa
  2. Yazılım

.NET 6.0 Hangfire ile Arkaplan Servisi – 2023

.NET 6.0 Hangfire ile Arkaplan Servisi – 2023
Hangfire 6.0 Hangfire ile Background Job

Merhabalar, Bu gönderimizde .NET 6.0 Hangfire ile Arkaplan Servisi hakkında konuşacağız.

 

.NET 6.0 Hangfire ile Arkaplan Servisi ( Background Service) Nedir, Ne İçin Kullanılır?

Background servisler IHostedService’den miras alınmış asenkron şekilde çalışan verdiğimiz görevleri belirli periyotlarda çalıştıran veya istediğimiz düzende çalıştıran sistemlerdir. Background Serviceleri .net core web uygulamalarımız içinde çalıştırarak daha fonksiyonel siteler yapabiliz. Bu yazımızda sizlere .NET 6.0 Hangfire ile Arkaplan Servisi nasıl implemente edilir ve kullanılır hakkında bilgilendirme yapacağız.

 

.NET 6.0 Hangfire ile Arkaplan Servisi (Background Service) Kullanım Alanları

  • Arkaplanda asenkron olarak çalışarak kaynaklarımı yönetme imkanını elimize alırız.
  • Günlük aylık veya farklı zamanlar içerisinde çalışması gereken işlemleriniz var ise bunları yönetebilme kolaylığı sağlar.

.NET 6 Arkaplan Servisi (Background Service) için Kullanılabilecek Kütüphaneler

Aşağıdaki kütüphaneleri sistemimize dahil ederek arkaplan servisleri için çok büyük kolaylıkar elde ederken bunları ufak projelerimizde kullanmak uygulamalarımız için gereksiz yük olabileceğinden dolayı bu tarz projelerinizde dotnet in kendi servisini kullanmanız daha faydalı olacaktır yazının ilerleyen kısımlarında bu konudan da bahsetmiş olacağız.

  • Hangfire
  • Quartz

Bu yazımızda sizlere Hangfire kütüphanesinin kullanımı hakkında bilgilendirme yapacağız ve örnek bir proje üzerinden nasıl implement edilir ona bakacağız.

Hangfire Nedir, Nasıl Kullanılır?

Hangfire, arkaplanda çalıştıracak olduğumuz işleri oluşturup ve istediğimiz şekilde yönetmemize imkan sağlayan açık kaynaklı bir kütüphane diyebiliriz. Biz bu yazımızda .NET 6.0 Hangfire ile Arkaplan Servisi yazmayı ve kullanmayı öğreneceğiz.

OKU  Ücretsiz Mobil Uygulama Geliştirme Araçları 2023

.NET 5.0, 6.0, 7.0 sürümlerinden herhangi birinde uygulayabilirsiniz. Ben bu konu özelinde .NET 6.0 MVC projemde basit bir projede kullandığım kodlar üzerinden anlatmaya çalışacağım ve karşılaştığım problemlerden de sizlere bahsedeceğim.

İlk önce bu sistemlere neden ihtiyaç duydum ne yapmak istedim sizlere ondan bahsedeyim, Kendimi geliştirmek amacıyla bir proje yazıyordum bu proje bir .NET 6 MVC ile bir randevu sistemi oluşturmam gerekiyordu. Bu randevu sisteminde gereksinimlerimden bir tanesi yaklaşan randevulara bir gün kala hatırlatma maili atıp randevuluya mail sistemi üzerinden bilgi vermek diğer ise randevu zamanı geçmiş randevuları otomatik olarak pasif duruma düşüren veya silen bir arkaplan servisi yazmam gerekiyordu. Bunları yapmak için araştırmalar yaparken hangfire ve quartz kütüphanelerine rastladım ve .NET 6.0 Hangfire ile Arkaplan Servisi için hangfire kütüphanesini kullanma kararı aldım.

 

Hangfire kütüphanesi, bir depolama alanına ihtiyaç duyar ve bu depolama alanı arka planda iş ilemeyle ilgili tüm bilgileri sakladığı yerdir. Bu depolama alanı için bir veritabanına bağlanalım.

Aşağıdaki kod parçası Hangfire’ın SQL server veritabanıyla nasıl yapılacağını gösterir. Ben .NET 6.0 Hangfire ile Arkaplan Servisi yazmak için projemde Hangfire için ayrı bir ConnectionString tanımlayarak kullanmayı tercih ettim.

"HangfireConnection": "Server=.;Database=AppointmentSystem;Trusted_Connection=True; TrustServerCertificate=True;"

Uygulamayı kullanmak için bazı NuGet paketlerini kurmak gerekiyor,

dotnet add package Hangfire.AspNetCore
dotnet add package Hangfire.SqlServer şeklinde kurulumları yapalım.

Kurulumlarımızı tamamladıktan sonra yapılandırma ayarlarımızı yapmamız gerekiyor ve program.cs e giderek 

using Hangfire;
using Hangfire.SqlServer;
ifadelerimizi ekliyoruz ve .NET 6.0 Hangfire ile Arkaplan Servisi yazabilmek için Hangfire’ı  yapılandırmamız gerekiyor.
services.AddHangfire(configuration=>configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(config.GetConnectionString("HangfireConnection")
, new SqlServerStorageOptions
{
  CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
  SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
  QueuePollInterval = TimeSpan.Zero,
  UseRecommendedIsolationLevel = true,
  DisableGlobalLocks = true
}));

services.AddHangfireServer();

Şeklinde yapılandırmamızı tamamladıktan sonra program.cs e

app.MapHangfireDashboard();  //Bu yöntem çalışma zamanı tarafından çağrılır. HTTP istek ardışık düzenini yapılandırmak için bu yöntemi kullanın.
app.UseHangfireDashboard();  //servislerin çalışıp çalışmadığını kontrol etmek ve planlanan işleri görebilmek için panel yapılandırması

ifadelerini ekledim

OKU  Pardus Ne Demek, Pardus Ne Anlama Gelmektedir? - 2023 -

Şimdi ayarlarımızı tamamladıktan .NET 6.0 Hangfire ile Arkaplan Servisi nasıl yazcağız ona bakalım.

İlk önce yaklaşan randevulara hatırlatma maili atmak için kullandığım şekle göz atalım. Bunun için bir servis oluşturmuştum ve kodlarım şu şekilde, bu servisi oluştururken hangfire için herhangi bir yapı kurmuyoruz ve normal işlemlerimizi yapıyoruz.

//Hatırlatma Mail Servisi
public void Run()
{
  var appointments=appointmentService.GetAllAppointmentAsync().GetAwaiter().GetResult();
  foreach (var aps in appointments)
  {
     if(aps.AppointmentDate < DateTimeOffset.Now.AddDays(5) && aps.IsDeleted==false)
  {
     mailService.SendMessageAsync(aps.CreatedBy, "Appointment Reminder", $"appointment reminder email. Date of your appointment. {aps.AppointmentDate.DateTime}");
  }
}

//Zamanı geçen randevuları otomatik silme ( pasif duruma alma) servisi
public async Task<IList<AppointmentDto>> AppointmentAutoDeletion()
{
   var appointments = await unitOfWork.GetRepository<Appointment>().GetAllAsync(x => !x.IsDeleted);
   foreach (var appointment in appointments)
   { 
       if(appointment.AppointmentDate.DateTime < DateTimeOffset.Now.DateTime)
     {
   appointment.IsDeleted= true; 
     }
   }

var map=mapper.Map<List<AppointmentDto>>(appointments);
await unitOfWork.SaveAsync();
return map;
}

Servislerimizi tanımladıktan sonra HomeController içerisinde aşağıdaki şekilde bir kullanım yaptım ve hatırlatma maili günde 1 kere 00:00 da çalışıyor ve 1 günden az kalmış randevular için hatırlatma maillerini atıyor. Tabi bu mail gönderme işlemini sağlayabilmek için ayrı bir mail servisine ihtiyacımız var ve bu mail servisi içerisinde SMTP ayarlarınıda yapılandırmamız gerekiyor. Bununla ilgili ayrı bir blog yazısı yazacağız bu tarz içeriklerin devamını link üzerinden takip edebilirsiniz.

RecurringJob.AddOrUpdate("MailJob", () => rememberMailJob.Run(), Cron.Daily); //hangfire remember mail
RecurringJob.AddOrUpdate("AutoDelitionJob", () => appointmentService.AppointmentAutoDeletion(), Cron.Minutely); //hangfire

verdiğimiz görevlerin doğru çalışıp çalışmadığını

localde çalışıyorsanız  örneğin localhost:5000/hangfire şeklinde hangfire paneline ulaşarak takip edebilirsiniz. Bizi şu şekilde bir ekran karşılıyor ve tekrarlayan işler sekmesinden verdiğimiz işlerin çalışma zamanlarını takip edebiliyoruz. İşler bölümünden başarılı ve başarısız işlerimizi takip edebiliyoruz. Çalışma sırasında oluşan hataları görüp aksayan yerleri tespit ederek düzenlemelerimizi yapıyoruz ve sorunsuz bir şekilde çalışmasını sağlayabiliyoruz. Hangfire çok kullanışlı ve güzel bir uygulamadır. Yukarıda görüldüğü gibi projeye dahil etmesi de bir o kadar basit.

OKU  2023 Yapay Zeka Teknolojileri: Yapay Zeka Nedir? Uygulamaları ve Gelecekteki Potansiyeli

Hangfire ile ilgili daha detaylı bir şekilde bilgi edinmek için Documentation dosyasına göz atabilirsiniz.

.NET 6.0 Hangfire ile Arkaplan Servisi Yazmak - KOZBOX

Hangfire Güvenli Mi?

Hangfire popüler bir .NET Kütüphanesidir ve açık kaynak kodlu oluğundan dolayı geniş bir topluluk tarafından destekleniyor ve bir çok geliştirici tarafından kullanılıyor. Gönül rahatlığı ile projelerinize dahil edebileceğinizi söyleyebilirim. Bunları yaparken tabi ki güvenlik sorunları oluşur mu gibi sorular aklınıza geliyor olabilir. Güvenlik konusunda sizler de tedbirlerinizi alarak ilerlemelisiniz örneğin hangfire kullanıcı paneline erişim sağlarken bir kullanıcı girişi veya authorization işlemi uygulayarak tedbirler alırsanız sorun yaşamayacağınızı düşünüyorum.

.NET Core Loglama işlemleri ile ilgili konumuz ilginizi çekebilir. Bu bağlantı üzerinden .net core loglama işlemleri adlı makalemize gidebilirsiniz.

Kozbox.com internet sitesi 22 ocak 2023 tarihinde yayın hayatına başlamıştır. Amacımız inovatif bir yaklaşımla en doğru ve en kaliteli içerikleri siz okuyucularımıza sunmaktır.

Yazarın Profili

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