EJB - Timer Service
Der Timer-Dienst ist ein Mechanismus, mit dem geplante Anwendungen erstellt werden können. Zum Beispiel die Erstellung von Gehaltsabrechnungen am 1. eines jeden Monats. In der EJB 3.0-Spezifikation wurde die Annotation @Timeout angegeben, mit deren Hilfe der EJB-Dienst in einer zustandslosen oder nachrichtengesteuerten Bean programmiert werden kann. EJB Container ruft die Methode auf, die mit @Timeout kommentiert ist.
Der EJB-Timer-Dienst ist ein vom EJB-Container bereitgestellter Dienst, mit dessen Hilfe ein Timer erstellt und ein Rückruf nach Ablauf des Timers geplant werden kann.
Schritte zum Erstellen eines Timers
Injizieren Sie SessionContext mit @Resource-Annotation in Bean -
@Stateless
public class TimerSessionBean {
@Resource
private SessionContext context;
...
}
Verwenden Sie das SessionContext-Objekt, um TimerService abzurufen und einen Timer zu erstellen. Zeit in Millisekunden und Nachricht übergeben.
public void createTimer(long duration) {
context.getTimerService().createTimer(duration, "Hello World!");
}
Schritte zur Verwendung des Timers
Verwenden Sie die Annotation @Timeout für eine Methode. Der Rückgabetyp sollte ungültig sein und einen Parameter vom Typ Timer übergeben. Wir brechen den Timer nach der ersten Ausführung ab, sonst läuft er nach festgelegten Intervallen weiter.
@Timeout
public void timeOutHandler(Timer timer) {
System.out.println("timeoutHandler : " + timer.getInfo());
timer.cancel();
}
Beispielanwendung
Lassen Sie uns eine Test-EJB-Anwendung erstellen, um den Timer-Service in EJB zu testen.
Schritt | Beschreibung |
---|---|
1 | Erstellen Sie ein Projekt mit dem Namen EjbComponent unter einem Paket com.tutorialspoint.timer, wie im Kapitel EJB - Anwendung erstellen erläutert . |
2 | Erstellen Sie TimerSessionBean.java und TimerSessionBeanRemote, wie im Kapitel EJB - Anwendung erstellen erläutert . Halten Sie den Rest der Dateien unverändert. |
3 | Bereinigen und erstellen Sie die Anwendung, um sicherzustellen, dass die Geschäftslogik gemäß den Anforderungen funktioniert. |
4 | Stellen Sie die Anwendung schließlich in Form einer JAR-Datei auf JBoss Application Server bereit. Der JBoss-Anwendungsserver wird automatisch gestartet, wenn er noch nicht gestartet wurde. |
5 | Erstellen Sie nun den EJB-Client, eine konsolenbasierte Anwendung, auf dieselbe Weise, wie im Kapitel EJB - Anwendung erstellen unter Thema erläutertCreate Client to access EJB. |
EJBComponent (EJB-Modul)
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);
}
Beachten Sie das jboss-Protokoll, sobald Sie das EjbComponent-Projekt auf JBOSS bereitstellen.
JBoss hat automatisch einen JNDI-Eintrag für unsere Session Bean erstellt - TimerSessionBean/remote.
Wir werden diese Suchzeichenfolge verwenden, um ein entferntes Geschäftsobjekt vom Typ - zu erhalten. com.tutorialspoint.timer.TimerSessionBeanRemote
JBoss Application Server-Protokollausgabe
...
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-Client)
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
Diese Eigenschaften werden verwendet, um das InitialContext-Objekt des Java-Namensdienstes zu initialisieren.
Das InitialContext-Objekt wird zum Nachschlagen der zustandslosen Session-Bean verwendet.
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 führt die folgenden Aufgaben aus.
Laden Sie Eigenschaften aus jndi.properties und initialisieren Sie das InitialContext-Objekt.
In der testTimerService () -Methode wird die jndi-Suche mit dem Namen "TimerSessionBean / remote" durchgeführt, um das Remote-Geschäftsobjekt (timer statusless EJB) abzurufen.
Anschließend wird createTimer mit einer Zeitspanne von 2000 Millisekunden als Zeitplanzeit aufgerufen.
EJB Container ruft die timeoutHandler-Methode nach 2 Sekunden auf.
Führen Sie Client aus, um auf EJB zuzugreifen
Suchen Sie EJBTester.java im Projektexplorer. Klicken Sie mit der rechten Maustaste auf die EJBTester-Klasse und wählen Sierun file.
Überprüfen Sie die folgende Ausgabe in der Netbeans-Konsole.
run:
[Wed Jun 19 11:35:47 IST 2013]timer created.
BUILD SUCCESSFUL (total time: 0 seconds)
JBoss Application Server-Protokollausgabe
Die folgenden Rückrufeinträge finden Sie im JBoss-Protokoll
...
11:35:49,555 INFO [STDOUT] timeoutHandler : Hello World!
...