En muchas situaciones es deseable ejecutar una determinada acción como consecuencia de otra. En estas situaciones podemos utilizar eventos y oyentes. Los oyentes están pendientes de que ocurra un evento y, cuando sucede, se activan.
¿En qué situaciones se pueden aplicar? Por supuesto, existen un sinfín de situaciones en las que podría ser deseable ejecutar eventos, pero mencionaremos las siguientes:
* Al registrar exitosamente una inscripción a un curso, el sistema emite el mensaje correspondiente.
* Al producirse un fallo en la actualización de un registro, el sistema almacena información sobre este.
* Cuando un usuario se registra en nuestro sitio web, el sistema envía un mail de bienvenida.
* Al vender un artículo y descontar su stock .
Jakarta EE pone a disposición de los programadores el concepto de EJB event, que nos brinda la posibilidad de generar eventos dentro de los EJBs para evitar el acoplamiento entre servicios. Gráficamente podemos observarlo en la Figura 3.1 .

Figura 3.1 Evento EJB.
A continuación, a modo de ejemplo, veremos una implementación en la cual simularemos la venta de un artículo. Si tras realizar dicha venta el stock del artículo se encuentra por debajo de las diez unidades, se disparará un evento que insertará un registro en una tabla ficticia llamada “faltantes”.
Comenzaremos escribiendo la clase Articulo:
Luego debemos crear el evento que contenga una variable de instancia de tipo Articulo.
Ahora debemos crear un servicio EJB con un método que controle el stock y dispare el evento. Para ello crearemos un Stateless EJB y, dentro de él, inyectaremos el evento. Este será lanzado mediante la invocación al método fire() de la interface Event.
Llegados a este punto, lo que debemos hacer es desarrollar los oyentes que estarán a la espera de que ocurra el evento. El oyente, generalmente llamado listener, será otro Stateless EJB, que tendrá en su interior un método escuchaEvento() que recibirá como parámetro un objeto de tipo Event junto a la anotación @Observes, como se puede apreciar en el siguiente fragmento de código:
Muchas de las tareas que realizan los operadores de sistemas de información se pueden automatizar y programar para que se realicen en determinados momentos del día, de la semana, del mes o del año.
Imagine que usted trabaja en el área de recursos humanos de una determinada empresa y tiene a su cargo la gestión de las licencias que los empleados pueden tomar. Para llevar a cabo esta tarea, dispone de un sistema en el que se registran solicitudes y se conceden las licencias. Estas podrían contener el código del empleado, el tipo de licencia, la fecha de inicio y de fin, y tener asociado un estado, por ejemplo, activo, inactivo, fuera de término, etc.
La tarea podría resultar muy tediosa si usted tiene que controlar el estado de cada una de ellas de manera individual. Por supuesto, la mayoría de sistemas realizarán esta tarea por usted. Desde luego, este no es el único caso en el que podríamos necesitar tareas programadas, otros ejemplos podrían ser la limpieza de registros huérfanos de la base de datos, generar reportes en formato PDF periódicamente, envíos de mails , etc.
Jakarta EE pone a disposición de los programadores los EJB Timers, que permiten programar tareas y ejecutarlas de manera automática sin intervención del usuario.
Para planificar una tarea, se debe crear un Stateless EJB y, dentro de él, desarrollar el método que se vaya a ejecutar. Para que este pueda correr sin la intervención del usuario, se debe agregar la anotación @Schedule, cuyos elementos se describen en Figura 3.2 .

Figura 3.2 Elementos del planificador.
El carácter asterisco (*) se denomina “comodín” y se utiliza para especificar todos los valores posibles, por ejemplo:
El siguiente fragmento de código muestra cómo se puede programar una pequeña tarea que imprima en consola el mensaje “Hola, soy una tarea programada y me ejecuto cada 10 segundos”.
3.5 Módulo EJB con acceso a base de datos
En el capítulo 2empleamos JPA en el contexto de Java SE (Standard Edition) y realizamos el mapeo de las tablas de la base de datos Universidad junto con algunas consultas.
En esta sección integraremos JPA al contexto web mediante el desarrollo de una aplicación enterprise que permita obtener el conjunto de facultades y carreras almacenadas en dicha base. Esta operación se realizará mediante un módulo EJB que contará con stateless session beans e interfaces locales y remotas.
Por último, desarrollaremos una aplicación cliente en modo consola (standalone) que permita acceder a los diferentes componentes EJB mediante JNDI.
El objetivo de esta sección se expresa gráficamente en la Figura 3.3 .

Figura 3.3 Esquema de acceso.
El código fuente desarrollado en esta sección se encuentra disponible en los siguientes repositorios:
* https://github.com/Francisco-Castillo/capitulo-ejb
* https://github.com/Francisco-Castillo/capitulo-ejb-cliente
El desarrollo de esta práctica incluye los siguientes puntos:
1. Crear pool de conexiones para la base de datos Universidad (revisar la sección 5.5 del apéndice A).
2. Crear aplicación enterprise con módulo EJB.
Читать дальше