.NET Core ile Worker Service Oluşturma

Mennan Köse
3 min readOct 4, 2019

.NET Core 3.0 ile beraber Worker isminde yeni bir proje şablonu geldi. Bu proje şablonu sayesinde Windows ve Linux servisleri oluşturabiliyoruz.

Konuyu daha da pekiştirebilmek için örnek bir uygulama üzerinden devam edelim. Yapacağımız bu uygulama saniyede bir bulunduğu zamanı log olarak yazacaktır.

Şimdi aşağıdaki komutu terminale yazarak yeni bir worker projesi oluşturalım.

Projemizi kullanmış olduğumuz IDE veya metin editörüyle açalım. Proje şablonumuz aşağıdaki benzer yapıda oluşmaktadır.

Program.cs dosyamızın yapısı aşağıdaki gibidir.

Şimdi ise Worker.cs dosyamızın içeriğini inceleyelim. Dosyamızın içeriği aşağıdaki gibidir.

Worker sınıfı BackgroundService ismindeki bir abstract sınıftan türetilmiştir. Bu sınıfın içerisinde ExecuteAsync, StartAsync ve StopAsync isminde olmak üzere 3 adet ezilebilir metot bulunmaktadır.

StartAsync metodunun içerisine servis başlarken yapılması geren işlerin yazılması gerekmektedir ve bu metot içerisinde ExecuteAsync metodu çalıştırılmalıdır. ExecuteAsync metodu çağırılırken StartAsync’e ait CancellationToken’ın parametre olarak gönderilmesi gerekmektedir.

ExecuteAsync metodunun içerisinde ise long-running çalışması gereken kodlarımızın bulunması gerekmektedir.

StopAsync metodunda ise uygulamamız veya servisimiz kapanırken yapılması gereken kodların yazılması gerekmektedir. Örneğin kullanılan resource’ların temizlenmesi, açılan veritabanı bağlantıları veya dosyaların kapatılması gibi işlemler bu metot içerisinde yapılmalıdır.

StartAsync ve StopAsync metotlarını kullanmak zorunlu değildir. Bu metotlar kullanılmadığı zaman servis çalışmaya başlamak için ExecuteAsync metodunu çağıracaktır.

Uygulamamızı çalıştırıp durdurduğumuzda aşağıdaki ekran görüntüsüne benzer bir ekranla karşılaşacağız.

Gördüğünüz gibi servisimiz çalışır çalışmaz ilk önce StartAsync metodunda ekrana yazdırdığımız Worker service started. log satırını görmekteyiz.

Akabinde ise ExecuteAsync metodunun ekrana o anın tarih ve saatini yazdırdığı log satırlarının devam ettiğini görüyoruz.

En sonunda ise StopAsync metodunun çalıştığını ve ekrana sırayla Worker service stopping. ve Worker service stopped. log satırlarını yazdığını gördük.

Şimdi ise yazmış olduğumuz worker service’i nasıl Windows servisi veya Linux daemon’ı olarak kullanabileceğimize bakalım.

Bu işlem için UseWindowsService ve UseSystemd metotlarından yararlanacağız.

Öncelikle aşağıdaki komutla ilgili paketleri projemize ekleyelim.

İlgili paketleri projemize ekledikten sonra Program.cs dosyamızı aşağıdaki şekilde düzenliyoruz.

Windows Servisleri:

Linux Daemonları:

Windows ve Linux servisleri arasındaki tek fark kullanmış olduğumuz extension metotların farklı olmasıdır. Windows servisleri için UseWindowsService, Linux daemonları için ise UseSystemd extension metodunu kullanıyoruz.

Şimdi ise sırada servisimizi ilgili işletim sistemlerine yüklemeye. Bu işlem için öncelikle worker servisimizi aşağıdaki komut yardımı ile publish alıyoruz.

Publish aldıktan sonra servisimizi kurmaya başlayabiliriz.

Linux Ortamına Servisin Kurulması

Linux işletim sistemlerinde servisler birer unit tanımına sahiptir. Bizim servisimiz için ilgili unit tanımı aşağıdakine benzer olacaktır.

Yazmış olduğumuz bu unit dosyasını /etc/systemd/system/ klasörünün altına kaydedeceğiz. Ben /etc/systemd/system/workersample.service olarak kaydettim.

Sonrasında ise aşağıdaki komutu kullanarak daemon listesinin yenilenmesini sağlıyoruz.

Unit dosyasında herhangi bir sorun yoksa servisimiz başarılı bir şekilde kurulmuş olacaktır. Servisimizin çalışma durumunu kontrol etmek için aşağıdaki komutu kullanabiliriz.

Windows Ortamına Servisin Kurulması

Windows ortamına servisimizi kurmak için sc.exe aracından yararlanıyoruz. PowerShell’i veya Komut İstemi’ni yönetici olarak çalıştırarak aşağıdaki komutu çalıştırıyoruz.

Bu komut sayesinde servisimiz Windows işletim sistemine yüklenmiş olacaktır. İlgili servisin durumunu services.msc üzerinden kontrol edebilirsiniz.

İlgili örneğe https://github.com/mennan/aspnetcore-worker-sample adresinden erişebilirsiniz.

Originally published at https://mennankose.com on October 4, 2019.

--

--