15 Ocak 2010 Cuma

Crontab periyod eşitsizliği

Posix sistemlerde yaygın olarak kullanılan ve oldukça da başarılı olan Crontab hizmeti, belirlenen (ya da beklenen) periyodlar için tam da beklendiği gibi davranmayabiliyor. Vereceğimiz periyod bölünmeye dayalı olacaksa bölmek istediğimiz hanenin üst limiti önemli oluyor. Bildiğimiz gibi bu değerler; saniye ve dakika haneleri için 60, saat hanesi için 24 gibi (aslında bu değerler yerine 0 kabul ediyoruz), aynı şekilde hafta ve ay değerlerinin de üst limitlerine göre bölümleme yapmamız önemli oluyor.

Atlamadan eklemek isterim ki, posix sistem crontablarında saniye hanesi yok! Java' da geliştirilmiş olan Quartz projesinde saniye eklenmiş durumda. Bu yüzden 5 haneli crontablar yerine 6 haneli olanlarını örnekleyeceğim.

Üst limitler neden önemli? Bunun için bir iki örneğe bakmamız daha iyi olacaktır.

Aşağıda verilen örneklerde periyodların tamamı eşit zaman aralıkları ile TETİKLENECEKTİR.

Her 10 dakikada bir:
* 0/10 * * * ?

Her 3 saatte bir:
* * 0/3 * * ?

Aşağıda verilen örneklerde ise periyodların tamamı eşit zaman aralıkları ile TETİKLENMEYECEKTİR.

Her 7 dakikada bir:
* 0/7 * * * ?

Her 40 saniyede bir: (bu 40. ve 0. saniyelerde yani 20 ve 40 sn aralıklarla tetiklenecek)
0/40 * * * * ?

Crontab hanelerini bölmek istediğimiz değer, ilgili hanenin makisimum değerini kalansız böldüğünde aralıklar eşit oluyor. Yine örnek verecek olursak; Dakika/Saniye hanesini 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30 gibi sayılar maksimum değeri olan 60 ı tam bölecek ve bu şekilde verilen bir periyod eşit zamanlarda tetiklenecektir.

Üst limitlerde saniye ve dakika için 60, saat içinse 24 olmadığını biliyorum, fakat crontab davranışında son tetikleme 0 içinde yapılıyor bu yüzden saniye ve dakika için 60 ve saat içinde 24 olarak değerlendirebiliriz.

Yukarıda belirttiğim gibi; Java için geliştirilmiş olan Quartz API, posix lerdeki crontab mantığını gerçeklediği için benzer durumla karşılaşacaksınız, şaşırmayın.

Son bir küçük uyarı; bölümleme yaparken
0/10 -> her 10. da bir demek (10. da bir kez tetiklenir)
*/10 -> 10. nun her birinde demek oluyor (10. da defalarca kez tetiklenir)

Hiç yorum yok:

Yorum Gönder