EJB - Zamanlayıcı Hizmeti
Zamanlayıcı Hizmeti, programlanmış uygulamanın oluşturulabileceği bir mekanizmadır. Örneğin, her ayın 1'inde maaş bordrosu oluşturma. EJB 3.0 spesifikasyonu, EJB hizmetinin durum bilgisi olmayan veya mesajla çalışan bir bean'da programlanmasına yardımcı olan @Timeout ek açıklamasını belirtmiştir. EJB Container, @Timeout tarafından açıklanan yöntemi çağırır.
EJB Zamanlayıcı Hizmeti, zamanlayıcı oluşturmaya ve zamanlayıcı sona erdiğinde geri aramayı programlamaya yardımcı olan EJB kapsayıcısı tarafından sağlanan bir hizmettir.
Zamanlayıcı Oluşturma Adımları
@Resource annotation kullanarak SessionContext'i bean'e enjekte edin -
@Stateless
public class TimerSessionBean {
@Resource
private SessionContext context;
...
}
TimerService'i almak ve zamanlayıcı oluşturmak için SessionContext nesnesini kullanın. Milisaniye cinsinden zaman ve mesaj geçirin.
public void createTimer(long duration) {
context.getTimerService().createTimer(duration, "Hello World!");
}
Zamanlayıcıyı Kullanma Adımları
Bir yöntem için @Timeout ek açıklamasını kullanın. Dönüş türü geçersiz olmalı ve Timer türünde bir parametre iletmelidir. Zamanlayıcıyı ilk çalıştırmadan sonra iptal ediyoruz, aksi takdirde düzeltme aralıklarından sonra çalışmaya devam edecektir.
@Timeout
public void timeOutHandler(Timer timer) {
System.out.println("timeoutHandler : " + timer.getInfo());
timer.cancel();
}
Örnek Uygulama
EJB'de Timer Service'i test etmek için bir test EJB uygulaması oluşturalım.
Adım | Açıklama |
---|---|
1 | EJB - Uygulama Oluştur bölümünde açıklandığı gibi com.tutorialspoint.timer paketinin altında EjbComponent adlı bir proje oluşturun . |
2 | Oluşturma TimerSessionBean.java ve TimerSessionBeanRemote açıklandığı şekilde EJB - Uygulama oluşturun bölüm. Geri kalan dosyaları değiştirmeden tutun. |
3 | İş mantığının gereksinimlere göre çalıştığından emin olmak için uygulamayı temizleyin ve oluşturun. |
4 | Son olarak, uygulamayı JBoss Uygulama Sunucusunda jar dosyası biçiminde dağıtın. Henüz başlatılmamışsa JBoss Uygulama sunucusu otomatik olarak başlayacaktır. |
5 | Şimdi, başlık altındaki EJB - Uygulama Oluştur bölümünde açıklandığı gibi, konsol tabanlı bir uygulama olan EJB istemcisini oluşturun.Create Client to access EJB. |
EJBComponent (EJB Modülü)
TimerSessionBean.java
package com.tutorialspoint.timer;
import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Timer;
import javax.ejb.Stateless;
import javax.ejb.Timeout;
@Stateless
public class TimerSessionBean implements TimerSessionBeanRemote {
@Resource
private SessionContext context;
public void createTimer(long duration) {
context.getTimerService().createTimer(duration, "Hello World!");
}
@Timeout
public void timeOutHandler(Timer timer) {
System.out.println("timeoutHandler : " + timer.getInfo());
timer.cancel();
}
}
TimerSessionBeanRemote.java
package com.tutorialspoint.timer;
import javax.ejb.Remote;
@Remote
public interface TimerSessionBeanRemote {
public void createTimer(long milliseconds);
}
EjbComponent projesini JBOSS üzerinde dağıtır dağıtmaz, jboss günlüğüne dikkat edin.
JBoss, oturum fasulyemiz için otomatik olarak bir JNDI girişi oluşturdu - TimerSessionBean/remote.
Bu arama dizesini, türündeki uzak iş nesnesini elde etmek için kullanacağız - com.tutorialspoint.timer.TimerSessionBeanRemote
JBoss Uygulama Sunucusu Günlük Çıktısı
...
16:30:01,401 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
TimerSessionBean/remote - EJB3.x Default Remote Business Interface
TimerSessionBean/remote-com.tutorialspoint.timer.TimerSessionBeanRemote - EJB3.x Remote Business Interface
16:30:02,723 INFO [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=TimerSessionBean,service=EJB3
16:30:02,723 INFO [EJBContainer] STARTED EJB: com.tutorialspoint.timer.TimerSessionBeanRemote ejbName: TimerSessionBean
...
EJBTester (EJB İstemcisi)
jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
Bu özellikler, java adlandırma hizmetinin InitialContext nesnesini başlatmak için kullanılır.
InitialContext nesnesi, durum bilgisiz oturum çekirdeğini aramak için kullanılacaktır.
EJBTester.java
package com.tutorialspoint.test;
import com.tutorialspoint.stateful.TimerSessionBeanRemote;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class EJBTester {
BufferedReader brConsoleReader = null;
Properties props;
InitialContext ctx;
{
props = new Properties();
try {
props.load(new FileInputStream("jndi.properties"));
} catch (IOException ex) {
ex.printStackTrace();
}
try {
ctx = new InitialContext(props);
} catch (NamingException ex) {
ex.printStackTrace();
}
brConsoleReader =
new BufferedReader(new InputStreamReader(System.in));
}
public static void main(String[] args) {
EJBTester ejbTester = new EJBTester();
ejbTester.testTimerService();
}
private void showGUI() {
System.out.println("**********************");
System.out.println("Welcome to Book Store");
System.out.println("**********************");
System.out.print("Options \n1. Add Book\n2. Exit \nEnter Choice: ");
}
private void testTimerService() {
try {
TimerSessionBeanRemote timerServiceBean = (TimerSessionBeanRemote)ctx.lookup("TimerSessionBean/remote");
System.out.println("["+(new Date()).toString()+ "]" + "timer created.");
timerServiceBean.createTimer(2000);
} catch (NamingException ex) {
ex.printStackTrace();
}
}
}
EJBTester aşağıdaki görevleri yapmaktadır.
Jndi.properties dosyasından özellikleri yükleyin ve InitialContext nesnesini başlatın.
TestTimerService () yönteminde, jndi araması, uzak iş nesnesini (zamanlayıcı durumsuz EJB) elde etmek için "TimerSessionBean / remote" adıyla yapılır.
Ardından, zamanlama zamanı olarak 2000 milisaniyeyi geçerek createTimer çağrılır.
EJB Container, 2 saniye sonra timeoutHandler yöntemini çağırır.
EJB'ye Erişmek için İstemciyi Çalıştırın
Proje gezgininde EJBTester.java'yı bulun. EJBTester sınıfına sağ tıklayın ve seçinrun file.
Netbeans konsolunda aşağıdaki çıktıyı doğrulayın.
run:
[Wed Jun 19 11:35:47 IST 2013]timer created.
BUILD SUCCESSFUL (total time: 0 seconds)
JBoss Uygulama Sunucusu Günlük Çıktısı
Aşağıdaki geri arama girişlerini JBoss günlüğünde bulabilirsiniz
...
11:35:49,555 INFO [STDOUT] timeoutHandler : Hello World!
...