Emektar İşçi Hizmeti — Worker

Cihat Solak
lTunes Tribe
Published in
3 min readFeb 14, 2021
Worker Service — Cross Platform

Çalışmaya başladığı andan, çalışmayı durdurma anına kadar ki geçen sürede arka planda çalışan servistir. Tamam, biraz hızlı gitmiş olabilirim. Selam ✋🏼 Sakinim sakinim sorun yok. Bir servise ihtiyacın var, zamanın kısıtlı ve belirlediğin süre ⏱️ sıklığına göre çalışsın istiyorsun öyle mi? 👌🏼

Aslında Worker Service kavramı dün çıkmış yeni bir servis değil. .Net 2.1 de çok stabil olmasa da IHostedService olarak proje dahil edilip kullanılabiliyordu.

Worker service cross-platform(Windows & Linux) üzerinde çalışabilir.

‍🔧👷🏼‍♂️👨🏼‍🔧 IHostedService ile projeye servis olarak kayıt edilen ve BackgroundService abstract class ından katılım alan bir arka plan hizmetidir. İçerisinde 3 adet override(ezilebilir) metot bulunmaktadır.

🏁 StartAsync(): Kendisine verilen isminden de anlaşılacağı üzere uygulama başlarken yapılması gereken işlerin yazılması gerekmektedir.

🏃‍♀️ ExecuteAsync(): Uygulama ayağa kalktığında çalışacağı iş mantığını barındıran metottur.

🛑 StopAsync(): Uygulama kapanırken yapılması gereken bir dizi işlemin kodlandığı yerdir. Basit bir örnek vermem gerekirse veri tabanı bağlantılarının kapatılması, kaynakların temizlenmesi.

🧼 Dispose(): Garbage Collector temizlenir. Oluşturulan nesne örnekleri, GAC(Global Assembly Cache🍪) temizlenir.

StartAsync() ve StopAsync() metotlarını kullanmak zorunda değiliz. Bu metotları kullanmadığımızda uygulama ExecuteAsync() metotunu çağıracaktır. Buradan da anlaşılacağı üzere yaşam döngüsü Start-Execute-Stop şeklinde ilerlemektedir.

Worker Services — (Worker,P roductWorker, PriceWorker)
Worker, ProductWorker, PriceWorker

Görsel projemizin kalbi olan program.cs’i temsil ediyor. HostBuilder metotu ile uygulama ayağı kaldırılırken ConfigureServices metotunda Worker, ProductWorker, PriceWorker servislerini kayıt ettim. Bu kısmı ihtiyacımıza göre çoğaltabiliriz. Yazdığımız her worker’ı burada tanımlamalıyız. Micro servisleri anımsatıyor bana. 👨🏼‍💻

Gerçek Hayat Senaryosu

Aslında her bir kaydettiğimiz servisin ayrı bir thread üzerinde çalışacak arka plan hizmetlerimizin şablona dönüştürülmüş halidir.

1- Borsa💸 verilerini çektiğin bir api olabilir ve 1–2 dakikada bir servise istek atıp veri tabanını güncel tutmak istiyor olabilirsin.

2- Uygulama health-check💔 senaryoları

3- Zamana dayalı herhangi bir iş kuralı, entegrasyon

Nasıl Proje Oluştururum? Nasıl Publish Ederim?

Visual Studio -> Create a new project -> Worker Service

Worker Kod Yapısı

.

Default olarak adı worker gelen class ımızı örnek olarak ekliyorum. Bu Worker class’ımın ExecuteAsync metodu 5 saniyede ⌛ bir tetiklenecektir.

stoppingToken: CancellationToken tipinde oluşturulup, programın durumunu bildirir. Program eğer çalışıyorsa true değerini döndürür.

Publish Settings

.

.

Self-Contained: Anlaşılacağı üzere bağımsız çalışan uygulamalardır. Çalışacağı sistemde .Net Core’un yüklü olması gerekmez çünkü tüm gerekli dosyaları içerisinde barındırır. Bununla beraber dosya boyutu da artacaktır.

.

Peki bir worker servisi nasıl Windows Servisi ya da Linux Daemonı olarak kullanabilirim?

Windows Service ⚙️

WorkerService’i Windows servis olarak kullanmak

Microsoft.Extensions.Hosting.WindowsServices” paketini projemize dahil ediyoruz. Ardından Program.cs e gelip ConfigureServices’den hemen önce UseWindowsService() extension metotunu çağırıyoruz.

Linux Deamon ⚙️

WorkerService’i Linux deamon olarak kullanmak

Microsoft.Extensions.Hosting.Systemd” projemize dahil ediyoruz. Ardından Program.cs e gelip ConfigureServices’den hemen önce UseSystemd() extension metotunu çağırıyoruz.

Linux ile Windows Service arasındaki tek fark ConfigureService içerisinde kullanmış olduğumuz extension metotun farklı olmasıdır. (UseWindowsService, UseSystemd)

Kodumuzu yazdık, Windows servis entegrasyonumuzu yaptık ve publish ettik.😇 Sıra uygulamamızı Windows servis olarak eklemeye geldi.

Komut İstemi (Command Prompt)ni yönetici olarak çalıştırın.

Servis Ekleme

sc create {Servis Adı} binPath=”DosyaYolu”

sc create EDevletWorkerService binPath=”C:\Jobs\publish-worker\EDevletWorkerService.exe”

Servis Silme

sc.exe delete {servis adı}

sc.exe delete EDevletWorkerService

Artık tüm işlem tamam, servisimiz windows işletim sistemine yüklenmiş olacaktır. Kontrol etmek adına services.msc üzerinden gidebilirsiniz.

Görüşürüz, adiós, aloha, arrivederci, ciao, vale or sayonara 😎💪

--

--