1 Temmuz 2013 Pazartesi

Spring TaskExecutor ve AsynchTaskExecutor

Anotasyon Kullanarak Asenkron ÇalışabilmekSpring ile anotasyon kullanarak asenkron çalışabilmek için eklenmesi gereken bir kaç konfigürasyon parametresi var. Örnek aşağıda.
<task:annotation-driven executor="executor"/>
<task:executor id="executor" pool-size="2"/>

task:annotation-driven ile @Async ile işaretlenmiş metodların bir thread içinde çalıştırılması sağlanıyor. Ayrıca @Scheduled olarak işaretlenmiş metodların da periyodik olarak çalıştırılıyor.

Burada task:annotation-driven sadece tek bir bean olabileceği yazılı. Eğer birden fazla olsaydı, anotasyonlu metodların hangi executor tarafından çalştırılacağını belirtmek gerekirdi, ancak şu anda bunu destekleyen bir tasarım yok.

Executor Hiyerarşisi

Executor hiyerarşisini aşağıya ekledim.

TaskExecutor
Java'dan türeyen bir başka arayüz.
AsynchTaskExecutor
AsynchTaskExecutor bir arayüz ve verilen işin bir başka thread içinde koşabilmesini sağlıyor.
En önemli metodu bir Future nesnesi döndürebilen Future<?> submit(Runnable task) metodu.

ThreadPoolTaskExecutor
ThreadPoolTaskExecutor AsynchTaskExecutor arayüzünü gerçekleştiren bir sınıf. Bu sınıfını yaratmanın en kolay yolu aşağıdaki gibi. Bu sınıf arka planda ThreadPoolExecutor sınıfını kullanıyor.

pool-size:
 ile "core pool size" yani kaç thread'in hayatta kalacağı belirtiliyor.

queue-capacity:
Örnek: core pool size sayısınca thread hayattaysa ve hiçbiri boşta değilse, yeni gelen iş kuyruğa eklenir. Bu kuyruğun büyüklüğü atanır. 

Anotasyonlar
@Async
Bu anotasyon ile işaretlenmiş metodlar, task executor içindeki bir thread tarafından çalıştırılır.


@Scheduled ve cron
Spring ile cron benzer belli zamanlarda iş çalıştırmak mümkün. Cron zamanlaması için kullanılan syntax 6 kısımdan oluşuyor . Solda sağa okursak:
1. Saniye
2. Dakika (0-50 arasında değer alır)
3. Saat (0-23 arasında değer alır)
4. Ayın kaçıncı günü (Rakamla)
5. Hangi ay
6. Gün   (Rakamla. Pazar 0'dan başlar veya yazı ile)

Eğer syntax'ta * varsa tüm anlamına geliyor. Eğer birimin yanına /(slash) ile başlayan bir sayı eklenmişse her anlamına geliyor. Eğer birim ,(vigül) içeriyorsa işlem birden fazla defa yapılacak demektir.

Tekrar Eden Örnek

*/5 * * * * : Her 5 dakikada bir tüm zamanlarda çalıştır


Tekrar Eden Mutlak zaman örneği
Ayda bir çalıştırmak
 @Scheduled(cron="0 0 1 6 * ?")  //Her ayın 6'sında gece 1 de başla

Gün içinde bir kaç defa çalıştırmak
0 1,13 * * * /etc/init.d/httpd restart //Gece 1 ve gündüz 13'te apache sunucusunu yeniden başlat