1. Giriş

Golang cron kütüphanesi, belirli zamanlarda veya aralıklarda işleri zamanlamak için kullanılan güçlü ve kullanımı kolay bir araçtır. UNIX cron servisine model alınmış olup Go uygulamalarına entegre edilebilen bağımsız bir kütüphane olarak uygulanmıştır. Cron kütüphanesi zaman tabanlı zamanlamayı ele alırken, sizin işinizi yürütmenize odaklanmanızı sağlar.

2. Örnek

cron kütüphanesini yüklemek

Projede cron kütüphanesini kullanmaya başlamak için ilk olarak go get komutunu kullanarak onu yüklemeniz gerekmektedir:

go get github.com/robfig/cron/[email protected]

cron paketini içe aktarın

Yükledikten sonra, onu Go programınıza şu şekilde içe aktarabilirsiniz:

import "github.com/robfig/cron/v3"

İşte her dakika bir mesaj yazdıran bir Cron işinin nasıl kurulacağına dair basit bir örnek:

package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
)

func main() {
	c := cron.New()
	c.AddFunc("0 30 * * * *", func() { fmt.Println("Her saat yarım saatte bir") })
	c.AddFunc("@hourly",      func() { fmt.Println("Her saat") })
	c.AddFunc("@every 1h30m", func() { fmt.Println("Her saat otuz") })
	c.Start()
	.. 
	// Funcs kendi goroutine'larında, asenkron olarak çağrılır.
	...
	// Funcs ayrıca çalışan bir Cron'a eklenebilir
	c.AddFunc("@daily", func() { fmt.Println("Her gün") })
	..
	..
	c.Stop()  // Zamanlayıcıyı durdur (zaten çalışan herhangi bir işi durdurmaz).
}

3. CRON İfade Biçimi

Bir cron ifadesi, 6 boşlukla ayrılmış alan kullanarak bir zaman setini temsil eder.

Alan adı Zorunlu mu? İzin verilen değerler İzin verilen özel karakterler
Saniye Evet 0-59 * / , -
Dakika Evet 0-59 * / , -
Saat Evet 0-23 * / , -
Ayın günü Evet 1-31 * / , - ?
Ay Evet 1-12 veya OCA-ARA * / , -
Haftanın günü Evet 0-6 veya PAZ-CMT * / , - ?

4. CRON İfadelerindeki Özel Karakterler

  • Yıldız ( * ) Yıldız, verilen alandaki tüm olası değerleri temsil eder. Örneğin, dakika alanındaki bir yıldız her dakikayı ifade eder.
  • Eğik Çizgi ( / ) Eğik çizgi karakteri artışları belirtmek için kullanılır. Örneğin, saniye alanında "*/15" sıfırdan başlayarak her 15 saniyede bir anlamına gelir.
  • Virgül ( , ) Virgül karakteri birden fazla ayrık değeri listelemek için kullanılır. Örneğin, haftanın günü alanında "PAZ,ÇAR,PER" ifadesi işin Pazartesi, Çarşamba ve Perşembe günleri çalışacağını belirtir.
  • Tire ( - ) Tire değer aralığını belirtir. Saatler alanında "9-17" ifadesi 9'dan 17'ye kadar her saat anlamına gelir.
  • Soru işareti ( ? ) Soru işareti, ayın günü ve haftanın günü alanlarında 'belirli bir değer yok' anlamını taşımak için kullanılabilir, bu özellikle biri için belirli bir değer belirtmeniz gerektiğinde diğerinin belirli bir değere ihtiyacı olmadığında kullanışlıdır.

5. Önceden Tanımlanmış Zamanlamalar

Mevcut önceden tanımlanmış zamanlamaların detaylı açıklaması, bir tablo formatında sunulmuştur:

Giriş Açıklama Eşdeğeri
@yearly (veya @annually) Yılda bir kez, gece yarısı, 1 Ocak 0 0 0 1 1 *
@monthly Ayda bir kez, gece yarısı, ayın ilk günü 0 0 0 1 * *
@weekly Haftada bir kez, Cumartesi/Pazar arasında gece yarısı 0 0 0 * * 0
@daily (veya @midnight) Günde bir kez, gece yarısı 0 0 0 * * *
@hourly Saat başı bir kez, saat başı 0 0 * * * *

6. Aralıklar ve Sabit Aralıklı Zamanlama

İşleri sabit aralıklarla çalıştırmak, cron kütüphanesinin diğer güçlü bir özelliğidir. Örneğin, her 2 saatte bir çalışacak bir işi zamanlamak için:

c.AddFunc("@every 2h", func() { fmt.Println("İş her iki saatte bir çalışır") })

7. Zaman Dilimleri ve İş Zamanlama

Yorumlama ve zamanlama, Go uygulamasının çalıştığı makinenin yerel saat diliminde yapılır. Yaz saati uygulaması değişikliklerinde dikkatli olunmalıdır, çünkü belirli zamanlar mevcut olmayabilir veya tekrarlanabilir.

8. İş Parçacığı Güvenliği ve Senkronizasyon

Cron kütüphanesi, iş parçacığı güvenli ve eşzamanlı olacak şekilde tasarlanmıştır. Yarış koşullarını önlemek için yöntem çağrılarının doğru sıralamasının korunması, çağrıcı için hayati önem taşır. İşlerin doğru bir şekilde zamanlanması ve yürütülmesini sağlamak için gerektiğinde uygun senkronizasyon mekanizmaları kullanılmalıdır.