22.07.2020

Java Timer Sınıfı Hakkında...

Geliştirdiğimiz uygulamalar içerisinde belirli aralıklarla sürekli çalışmasını istediğimiz işler olabiliyor. Bu durumda genellikle Quartz ya da aynı işi kullanan bir başka yazılım/kütüphane kullanıyoruz. Çoğu zaman da etkin bir şekilde görev yerine getiriliyor.

Java'nın Timer ve TimerTask sınıflarını kullanarak da bu işi gerçekleştirmek mümkün. Elbette Quartz ve benzeri yazılımlar bu konuda çok ilerlemiş durumda ve muhtemelen işinizi halletmek için bu yazılımlardan birini kullanmalısınız. Bu örnek tamamen öğrenme amaçlı. :)

Bu örnekte Timer sınıfından türetilmiş JobScheduler sınıfından bir instance'ı ServletContext'e parametre olarak atıyoruz. Bu iş için JobSchedulerInitializer'ı kullanıyoruz.

Context oluştuğunda (Sunucu çalışmaya başlarken ya da context reload olduğunda) scheduler veri tabanından çalışması istenen görevleri okuyup JobScheduler'a verilen gecikme ile verilen peryotta çalışmak üzere kaydediyor. 

ScheduledJob sınıfı bir JPA Entity'si ancak aynı zamanda TimerTask sınıfından türetiliyor. Gerçek bir uygulamada bu ikisinin ayrı olması daha doğru olur. Örnek açısından bu şekilde daha anlaşılır olduğunu düşünüyorum. ScheduledJob sınıfında yer alan log methodu da orada olmamalı mesela. Demek istediğim şu ki: bunu uygulamanızda bu şekliyle kullanmayın. :)

Zamanlanmış olarak çalıştırmak istediğiniz her şey ise ScheduledJob sınıfından türettiğiniz bir sınıfta olmalı. Bunun için örnek sınıf olan Tick sadece o anki zamanı konsola yazıyor. 

Timer sınıfından oluşturduğumuz instance tek bir thread'de çalışıyor. Bu nedenle zamanladığımız görevlerden herhangi biri uzun bir sürede çalışıyorsa diğer görevlerin çalışma zamanını etkileyebiliyor. Bunu da göz önünde bulundurmak lazım. 

Ben kodu yazarken eğlendim. Siz de incelerken eğlenirsiniz umarım.

Esen kalın.