Merhabalar arkadaşlar. Bu yazıda sizlerle bir işlemin belli bir süre sonra yapılmasını sağlayan EJB Timer Service konusunu öğreneceğiz.
Bazı durumlarda bir işlemin yapılması için belli bir süre geçmiş olması gerekebilir. Örneğin siz bir işlem talep ettiniz ve işlemin karşılığını hemen alamıyorsunuz, diyelim ki 1 saat sonra alabiliyorsunuz. İşte EJB Timer Service kullanıp, gerekli bilgi ya da bilgileri verip 1 saat sonra işlemin sonucunu gerekli yerden gidip alabiliriz.
Şimdi örnek kodlarımızı inceleyelim ve nasıl kullanıldığına bakalım.
EJBTimerRemote.java
1 2 3 4 5 6 7 8 9 |
package com.ejbtimerinterface; import javax.ejb.Remote; @Remote public interface EjbTimerRemote { public void callEjbTimerService(long duration,String name); } |
EJB Timer Service’i yine bir Session Bean içinde kullanacağımız için bir interface’e ihtiyacımız var. Burada @Remote veya @Local kullanmak size kalmış. Projeniz dışarı ile bağlantı kuracak (farklı JVM) ise @Remote kullanmanız gerekecektir. Aynı JVM için @Remote ve @Local kullanabilirsiniz.
EJBTimerSessionBean.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
package com.ejbtimerbean; import com.ejbtimerinterface.EjbTimerRemote; import com.jsfbean.JSFBean; import java.util.Date; import javax.annotation.Resource; import javax.ejb.Schedule; import javax.ejb.SessionContext; import javax.ejb.Stateless; import javax.ejb.Timeout; import javax.ejb.Timer; import javax.inject.Inject; @Stateless public class EjbTimerSessionBean implements EjbTimerRemote{ @Resource private SessionContext sessionContextObject; @Inject private JSFBean jsfBeanObject; @Override public void callEjbTimerService(long duration,String name) { System.out.println("Timer Nesnesi Oluşturuldu"+new Date()); sessionContextObject.getTimerService().createTimer(duration, name); } @Timeout public void timeOutEvent(Timer timerObject) { System.out.println("Timeout Gerçekleşti!"+new Date()); jsfBeanObject.processMethod(timerObject.getInfo().toString()); timerObject.cancel(); } } |
Session Bean içinde @Resource notasyonu ile bir SessionContext nesnesi tanımlıyoruz. Bu nesneyi bir Timer Service nesnesi elde ederken kullanacağız. Daha önce kullandığımız @EJB notasyonuna benzer şekilde enjekte işlemi uygulanıyor burada. @Inject notasyonu ile CDI Bean’e erişim sağlıyoruz ve bir CDI Bean nesnesi tanımlıyoruz. CDI Bean’in ne olduğu ve nasıl kullanıldığına dair bir yazıyı şuradan okuyabilirsiniz:https://kod5.org/jsf-dersleri-cdi-bean-kullanimi/
Interface içinde tanımladığımız callEjbTimerService metodunu Override ediyoruz ve metodun içinde yukarıda tanımadığımız SessionContext nesnesini kullanarak getTimerService metodu ile bir Timer Service örneği elde ediyoruz. Bu Timer Service içinden de createTimer metodu ile bir Timer örneği elde ediyoruz. createTimer metoduna iki parametre geçiriyoruz ve parametrelerden birisi işlemin ne kadar süre sonra yapılacağını bildiren duration. createTimer metodu çağırıldığında kendisine verilen duration kadar beklemekte ve süre bittiğinde @TimeOut ile işaretlenmiş metodu bulup çağırmaktadır. createTimer metodu overloading yapılarak farklı parametreler alabilecek şekilde bir kaç adet yazılmış.
JSFBean.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
package com.jsfbean; import com.ejbtimerinterface.EjbTimerRemote; import java.io.Serializable; import javax.ejb.EJB; import javax.enterprise.context.RequestScoped; import javax.inject.Named; @Named(value = "jsfBean") @RequestScoped public class JSFBean implements Serializable{ String name=""; long duration=5; String message=""; @EJB private EjbTimerRemote ejbTimerRemoteObject; public long getDuration() { return duration; } public void setDuration(long duration) { this.duration = duration; } public String getName() { return name; } public void setName(String name) { ejbTimerRemoteObject.callEjbTimerService(duration*1000, name); setMessage("Girdiğiniz İsim "+duration+" Saniye Sonra Konsolda Olacak,Kontrol Ediniz"); } public void processMethod(String name) { System.out.println("TimeOut Metodundan Gelen İsim:"+name); System.out.println("TimeOut akabinde yapılacak iş processMethod ile yapılabilir."); } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } |
JSFBean sınıfı içindeki ifadelerin neredeyse hepsini bildiğimiz için anlatıcak ekstra bir şey yok arkadaşlar. Sadece setName metoduna değinmek istiyorum. setName metodu içinde callEjbTimerService metodunu çağırırken duration değişkenini 1000 ile çarpıyoruz. Çünkü createTimer metodunu çağırırken biz long tipinde bir parametre veriyoruz ve createTimer bunu mili saniye cinsinden alıyor. 1 saniye 1000 milisaniye olduğundan gönderirken de 1000 ile çarpıp gönderiyoruz. callEjbTimerService metoduna bir de name değişkenini geçiriyoruz. İkinci parametre bizim belli bir süre sonra işleyeceğimiz veri olacak. Bunun dışında tüm kısımlar bildiğimiz ve öğrendiğimiz kısımlar.
index.xhtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <title>EJB Timer Bean Kullanımı</title> </h:head> <h:body> <h:form> <h:panelGrid columns="2"> <h:outputText value="İsim Giriniz:"/> <h:inputText value="#{jsfBean.name}"/> <h:outputText value="#{jsfBean.message}"/> <h:commandButton value="GÖNDER"/> </h:panelGrid> </h:form> </h:body> </html> |
Ekran Çıktıları

Timer nesnesinin oluşturulması ile geri sayım başlamış oluyor. Biz 5 saniye süre verdiğimiz için Timer nesnesinin oluşturulmasından 5 saniye sonra @TimeOut işaretli metodu çağırılıyor.
Bu yazıda bu kadar arkadaşlar. Gelecek yazıda @Schedule notasyonu ile Timer Service konusunu işleyeceğiz. Sağlıcakla kalın.