Proje kurulumu, sınıfları inceledikten sonra bir Windows servis mantığında
çalışacak örnek uygulama üzerinden worker servisi anlatacağım.
Proje oluşturma adımları
CreateHostBuilder metodu, Worker sınıfını kullanacak servisin çalıştırılma işlemini yapar. Worker sınıfı, varsayılan olarak gelmektedir, farklı isimde bir sınıf oluşturulabilir.
using Microsoft.Extensions.DependencyInjection; | |
using Microsoft.Extensions.Hosting; | |
namespace DeleteBackUpFileService | |
{ | |
public class Program | |
{ | |
public static void Main(string[] args) | |
{ | |
CreateHostBuilder(args).Build().Run(); | |
} | |
public static IHostBuilder CreateHostBuilder(string[] args) => | |
Host.CreateDefaultBuilder(args) | |
.UseWindowsService() //Worker service working as a Windows Service | |
.ConfigureServices((hostContext, services) => | |
{ | |
services.AddHostedService<Worker>(); | |
}); | |
} | |
} |
Worker sınıfını inceleyecek olursak BackgroundService sınıfından miras alır. Bu sınıf servisin çalıştırılması, başlatılması, durdurulması, dispose gibi metotları barındırır. Aşağıdaki görselde BackgroundService sınıfına ait metotlar yer alır.
- ExecuteAsync metodu, servis arka planda çalışır durumdayken yapılacak işlemleri barındırır. Abstract bir metot olduğu için Worker sınıfında kullanılması zorunludur. Metotta kullanılan stoppingToken parametresi, servis durdurulmasının tetiklenip tetiklenmediği bilgisini alır. Tetiklenme işlemi olmayana dek arka planda bu işlemler sürecektir.
- StartAsync metodu, servisin başlatılma aşamasında yapılacak işlemleri barındırır. Örnek olarak bir log dosyasına “Servis başlatıldı.” bilgisi yazdırılabilir.
- StopAsync metodu, servisin durdurulması sırasında yapılacak işlemleri barındırır. Örnek olarak bir log dosyasına “Servis durduruldu.” bilgisi yazdırılabilir.
- Dispose metodu ise kullanılmayan kaynakların serbest bırakılması işini yapar. Bir veri tabanı bağlantısının kapatılması ya da sınıf instance’lerinin bellekten temizlenmesi işini yapar. (Garbage Collector)
Worker Servisin Windows Servis olarak çalışması için
Nuget’tan aşağıdaki paketin kurulması gerekmektedir.
Microsoft.Extensions.Hosting.WindowsServices
.NET Core 3.1 versiyonunda projeyi geliştireceğim için 3.1.10 versiyonu
kurulacaktır. .NET 5 üzerinde kullanılacaksa uygun versiyon
kurulmalıdır.
Paketlerin kurulumu tamamlandıktan sonra Program.cs sınıfındaki CreateHostBuilder metodunda UseWindowsService() metodu eklenerek Windows servis olarak geliştirdiğimiz servisi çalıştırabileceğiz.
Örnek uygulamada; veri tabanı backup dosyalarının belirtilen sürede bir
silinmesini sağlayan bir servis kurgulandı. Amaç diskte yer kaplamasını
önlemektir. Servisin adı DeleteBackUpFileService'dir.
namespace DeleteBackUpFileService | |
{ | |
public class Worker : BackgroundService | |
{ | |
private int _serviceRunInDays; | |
private string _backUpFilePath; | |
private IServiceScopeFactory _serviceScopeFactory; | |
public Worker(IServiceScopeFactory serviceScopeFactory) | |
{ | |
_serviceScopeFactory = serviceScopeFactory; | |
} | |
public override Task StartAsync(CancellationToken cancellationToken) | |
{ | |
var configuration = _serviceScopeFactory.CreateScope().ServiceProvider.GetRequiredService<IConfiguration>(); | |
_backUpFilePath = configuration["FileConfigSettings:BackUpFilePath"]; | |
_serviceRunInDays = Convert.ToInt32(configuration["FileConfigSettings:RunIntervalInDays"]); | |
return base.StartAsync(cancellationToken); | |
} | |
public void ClearBackUpFile() | |
{ | |
string[] files = Directory.GetFiles(_backUpFilePath, "*.bak*"); | |
Array.ForEach(files, File.Delete); | |
} | |
protected override async Task ExecuteAsync(CancellationToken stoppingToken) | |
{ | |
while (!stoppingToken.IsCancellationRequested) | |
{ | |
ClearBackUpFile(); | |
await Task.Delay(TimeSpan.FromDays(_serviceRunInDays), stoppingToken); | |
} | |
} | |
} | |
} |
{ | |
"Logging": { | |
"LogLevel": { | |
"Default": "Information", | |
"Microsoft": "Warning", | |
"Microsoft.Hosting.Lifetime": "Information" | |
} | |
}, | |
"FileConfigSettings": { | |
"BackUpFilePath": "D:\\Yedek", | |
"RunIntervalInDays": "7" | |
} | |
} |
Yorumlar
Yorum Gönder