EJB - Servicio de temporizador
El servicio de temporizador es un mecanismo mediante el cual se puede construir una aplicación programada. Por ejemplo, generación de nóminas el día 1 de cada mes. La especificación EJB 3.0 ha especificado la anotación @Timeout, que ayuda a programar el servicio EJB en un bean sin estado o controlado por mensajes. EJB Container llama al método, que está anotado por @Timeout.
El servicio de temporizador EJB es un servicio proporcionado por el contenedor EJB, que ayuda a crear un temporizador y programar la devolución de llamada cuando expira el temporizador.
Pasos para crear un temporizador
Inyectar SessionContext en bean usando la anotación @Resource -
@Stateless
public class TimerSessionBean {
@Resource
private SessionContext context;
...
}
Utilice el objeto SessionContext para obtener TimerService y crear un temporizador. Pasa el tiempo en milisegundos y mensaje.
public void createTimer(long duration) {
context.getTimerService().createTimer(duration, "Hello World!");
}
Pasos para usar el temporizador
Utilice la anotación @Timeout para un método. El tipo de retorno debe ser nulo y pasar un parámetro de tipo Timer. Estamos cancelando el temporizador después de la primera ejecución; de lo contrario, seguirá funcionando después de los intervalos fijos.
@Timeout
public void timeOutHandler(Timer timer) {
System.out.println("timeoutHandler : " + timer.getInfo());
timer.cancel();
}
Aplicación de ejemplo
Creemos una aplicación EJB de prueba para probar Timer Service en EJB.
Paso | Descripción |
---|---|
1 | Cree un proyecto con un nombre EjbComponent en un paquete com.tutorialspoint.timer como se explica en el capítulo EJB - Crear aplicación . |
2 | Cree TimerSessionBean.java y TimerSessionBeanRemote como se explica en el capítulo EJB - Crear aplicación . Mantenga el resto de los archivos sin cambios. |
3 | Limpie y compile la aplicación para asegurarse de que la lógica empresarial funcione según los requisitos. |
4 | Finalmente, implemente la aplicación en forma de archivo jar en JBoss Application Server. El servidor de aplicaciones JBoss se iniciará automáticamente si aún no se ha iniciado. |
5 | Ahora cree el cliente EJB, una aplicación basada en consola de la misma manera que se explica en el capítulo EJB - Crear aplicación en el temaCreate Client to access EJB. |
EJBComponent (módulo EJB)
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);
}
Tan pronto como implemente el proyecto EjbComponent en JBOSS, observe el registro de jboss.
JBoss ha creado automáticamente una entrada JNDI para nuestro bean de sesión - TimerSessionBean/remote.
Usaremos esta cadena de búsqueda para obtener un objeto comercial remoto de tipo: com.tutorialspoint.timer.TimerSessionBeanRemote
Salida de registro del servidor de aplicaciones JBoss
...
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 (cliente EJB)
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
Estas propiedades se utilizan para inicializar el objeto InitialContext del servicio de nombres de Java.
El objeto InitialContext se utilizará para buscar un bean de sesión sin estado.
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 está realizando las siguientes tareas.
Cargue las propiedades de jndi.properties e inicialice el objeto InitialContext.
En el método testTimerService (), la búsqueda de jndi se realiza con el nombre "TimerSessionBean / remote" para obtener el objeto comercial remoto (temporizador EJB sin estado).
Luego se invoca createTimer pasando 2000 milisegundos como tiempo de programación.
EJB Container llama al método timeoutHandler después de 2 segundos.
Ejecute el cliente para acceder a EJB
Busque EJBTester.java en el explorador de proyectos. Haga clic derecho en la clase EJBTester y seleccionerun file.
Verifique la siguiente salida en la consola de Netbeans.
run:
[Wed Jun 19 11:35:47 IST 2013]timer created.
BUILD SUCCESSFUL (total time: 0 seconds)
Salida de registro del servidor de aplicaciones JBoss
Puede encontrar las siguientes entradas de devolución de llamada en el registro de JBoss
...
11:35:49,555 INFO [STDOUT] timeoutHandler : Hello World!
...