Cron Job ile Planlanmış Task Yazımı

Methodlarını Zamanla Çalıştırmayı Kavrayın

Ulaş Müezzinoğlu
4 min readNov 2, 2022

Herkese tekrardan merhabalar, bu yazıda Scheduled Task lar ile belirli zaman periyod larında methodlarınızı çalıştırmayı anlatacağım. Çok kısa bir özet geçecek olursam, Methodlarını X saatte bir, haftanın X günü, o günün de x-y aralığında şeklinde çok geniş aralık imkanları ile otomatik olarak çalışmasını sağlayacağız.

Aşağıda Makalenin İçeriğini bulabilirsiniz. Tıklayarak istediğiniz kısıma ulaşabilirsiniz.

Scheduled Task Nedir ?

Yukarıda ki cümlemi tekrar etmek istemiyorum ama, derinlemesine vurgulamak istiyorum. Dışarıdan Developer ya da User tetiklenmesine ihtiyaç duyulmadan, Sistem tarafından ona verilen zaman aralığına göre otomatik olarak çalışan methodlara Scheduled Task ya da diğer bir adıyla Cron Job Denir.

Scheduled Task Neden Gereklidir ?

Sorulan soruların başında gelir, hangi senaryolarda böyle bir şeye ihtiyaç duyar ki insan ? bunlardan biraz örnek vereceğim ve inanıyorum ki zihninizde çok daha fazla senaryo canlanacaktır.

İlk örneği bizzat hayatımda yaşadığım senaryodan vermek istiyorum :

Bir ilan sisteminiz var ve kullanıcılarınız ilan paylaşıyorlar, ama bu ilanların süresi 30 gün. 30 günün sonunda ilanın status’unu EXPIRED olarak işaretlemek istiyorsunuz. Bu durumda Cron Job ile tanışmamış birisinin yapacağı ilk hareket muhtemelen o tabloya TTL yani Time to Live index katmak olacaktır. Bunun yanlış bir hareket olduğu adından belli, biz 30 gün sonunda o kayıtı silmek istemiyoruz ! sadece status’ unu değiştireceğiz.

Peki Çözümü Nedir ?

Bir Cron job hazırlayarak her gün 1 kez çalışmasını belirtebilir, ve method içini de, 30 günü aşkın ilanları getir şeklinde bir sorgu ile expired olması gereken ilanları çekerek, bu entity‘ leri update edebilirsiniz.

Biraz daha senaryo örnek verecek olursak, ne durumlarda kullanmanız gerektiği sorusunun cevabının sorusunu kendinize şu soruyu sorarak anlayabilirsiniz. → “Ben bu kodu x zaman aralığında elimle tetiklemek zorunda mıyım ?” sorunun cevabı evet ise cron job a başvurmak için başka bir nedene ihtiyaç yok.

Scheduled Task İçin Opsiyonlar

Community içerisinde açık kaynak olarak geliştirilmiş bir çok Schedule Kütüphanesi bulunmaktadır. Biraz Bahsedecek olursak: Quartz, Jcrontab , Gos4j ve JDRing gibi kütüphaneler mevcut, ama bunlara kafa yormaya hiç gerek yok, zira Spring bize harika bir Schedule altyapısı sunuyor, sadece @Scheduled annotation ı ile bu yapıyı kullanabilirsiniz. Tüm Library listesini görmek için BURAYA tıklayabilirsiniz.

Schedule Konfigrasyonu

Artık kodlamaya başlayabiliriz, Konfigrasyon esnasında çok önemli bir noktaya vurgu yapmam gerekiyor. Her Job kendisini ayrı bir thread de çalıştırır. ve çok sık çalışan job lar, ileride out of memory hatası almanıza sebeb olabilir. Bu yüzden Konfigrasyon esnasında Thread Pool Ayarlarını yapıyoruz.

Evet işte bu kadar basit temelde, @EnableScheduling annotation ı ile direkt projenizde aktif edebilirsiniz. Aynı zamanda ThreadPoolTaskScheduler ile pool size’ ımı 1 olarak set edip, sadece 1 thread üzerinden joblarımın çalışmasını teminat altına aldım.

Şimdi Scheduled Task Methodu hazırlayalım. Şimdilik sadece ekrana log bassın.

Başarılı şekilde çalıştı. ve tam da ayarladığım gibi Thread Pool dikkate alınarak sadece 1 thread üzerinde çalıştırıldı. Şimdi Zaman periyodu belirtme üzerine bir çok örnek vereceğim.

Periyod Hazırlanması

@Scheduled annotation ı bir çok şekilde periyod alabilir bunları aşağıda listeliyor olacağım.

FixedDelay : Yani sabit gecikme süresi anlamına gelir, Cron Job bir önceki Job’ ın bitiminden sonra parametrede belirlediğimiz süre kadar bekler. Yani fixedDelay=2000 dediğimizde önceki job’ ın bitiminden 2 saniye sonra yeni job başlar.

FixedRate : Bu seçenek ise bir önceki gibi ama tek farkı bir önce ki job’ın başladığı andan itibaren başlar süre saymaya. Yani fixedRate=2000 dediğimizde önceki job ‘ın başladıktan sonra 2 saniye sonrasında bu job çalışacak demek oluyor.

küçük bir not : parametrede verilen süreler MilliSecond (MS) üzerindendir.

diğer kullanımına geçmeden önce, bu 2 kullanımın ‘String’ kullanımları da mevcuttur.

FixedDelayString | FixedRateString : içine String olarak zaman alabilir. örneğin :

PT1S → 1 Saniye aralıklarla çalış

PT1M → 1 Dakika aralıklarla çalış

PT1H → 1 Saat aralıklarla çalış

PT1D → 1 Gün aralıklarla çalış

CRON : Bunun için ayrı bir section açmak istedim çünkü diğerlerinden farklı bu seçenek en gelişmişi ve en farklısı, farklı olan yanı ise içine bir CRON EXPRESSION alıyor olması.

Kafaları karıştırmadan hemen örneklerini aşağıya hazırlıyorum.

Cron expression temelde 6 kısımdan oluşur. Bu alanlar → saniye, dakika saat, ayın günü, ay, haftanın hangi günleri çalışacağı bilgisi

"0 0 * * * *" -> Günün her saati çalışacak
"*/10 * * * * *" -> Her 10 saniyede bir çalışacak
"0 0 15-17 * * *" -> Her gün 15, 16 ve 17 saatlerinde çalışacaktır
"0 0 15,17 * * *" -> Her gün 15 ve 17 saatlerinde çalışacaktır
"0 0 15-17 * * MON-FRI" -> Pazartesiden cumaya kadar 15 ile 17 saatleri arasında çalışır

kod üzerinde ise tam olarak şöyle görülecektir.

@Scheduled(cron = "0 0 15-17 * * *")
public void testSchedule(){
log.info("Test Schedule Runned ! " + Thread.currentThread();
}

Best Practices

@Scheduled annotation ı içerisinde kullanabileceğiniz 2 tane çok faydalı parametre mevcut bunları da açıklamadan yazıyı bitirmek istemem.

Time Unit : Hatırlarsanız yukarıda FixedDelay ve FixedRate den bahsederken, bunların MilliSecond üzerinden çalıştığını belirtmiştim. Bu parametre ile verilen zamanın birimini değiştirebilirsiniz.

Zone : Adından da anlaşılacağı üzere, hangi bölgenin saat dilimine göre çalışacağını belirtir. cron içerisine pazartesiden cumaya ya da 15 den 17 diye belirttik evet ama hangi GMT ye göre olduğunu da belirtebilirsiniz.

Yazının sonuna geldiğimizde, buraya kadar okuduğunuz için çok teşekkür ederim. Umarım bu yazı sizlere aradığınızı katmıştır. Başka bir yazıda görüşmek üzere…

Destek olmak için Github Adresimi ve Linkedin Profilimi ziyaret edebilirsiniz.

Şimdiden Teşekkürler, iyi çalışmalar.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response