TomEE & CDI Async

Antesala

TomEE es un servidor de aplicaciones especializado en aplicaciones JavaEE y está basado en Tomcat. Hace poco se ha realizado el lanzamiento de TomEE 8.0 M1, en esta presente versión se presentan muchos cambios y nuevas funcionalidades marcando las tendencias de tecnología.

Microprofile 1.3

TomEE reafirma su compatibilidad con Microprofile, dando el salto de la última versión soportada, siendo esta la 1.2, ahora en esta versión de TomEE, teniendo como versión por defecto soportada la 1.3.

JavaEE y JakartaEE

Está última versión de TomEE se sigue dando soporte a JavaEE y JakartaEE, teniendo como principales ventajas la compatibilidad con las siguientes tecnologías:

  • JSON-B , una especificación muy necesaria para proporcionar el enlace entre JSON y POJO, obligatoria para el desarrollo de API REST modernas.
  • EE Security API , para simplificar y modernizar cómo se maneja toda la seguridad en el contenedor.

Según una publicación oficial.


CDI y TomEE

Para esta nueva versión de TomEE ya se cuenta con una versión estable y soporte para CDI 2.0 tanto para MicroProfile 1.3, JavaEE y JakartaEE.

Pero, ¿Cómo funciona CDI Async y TomEE?

Resultado de imagen para asynchronous

Todos sabemos las bondades que tiene contar con una comunicación asíncrona, esa es la idea principal de CDI 2.0 async, lograr una comunicación asíncrona nativa (no hacer malabares para obtener este tipo de comunicación) en un entorno Java.

Funcionamiento

En anterioridad había que hacer maravillas con los eventos con“fire” para poder simular una comunicación asíncrona, luego CDI 2.0 incorporó “fireAsync” y ahora es cuando se lanza el soporte oficial por parte de Apache TomEE.

Eventos

https://wiki.enterpriselab.ch/el/_media/edu:enapp:technology:cdi_event.jpg

Los eventos son funcionalidades que provee CDI bajo demanda, es decir que dependen del número de demanda.

Ahora, en CDI Async, un evento se comporta de la misma manera, la diferencia será que la respuesta es en tiempo asíncrona.

La sintaxis de una petición asíncrona en CDI es la siguiente:

http://docs.jboss.org/cdi/spec/2.0/cdi-spec.html#firing_events_asynchronously

Un ejemplo sencillo …

Nuestra clase que define el evento, dicha clase solamente estará encargada de obtener un mensaje y lo podremos obtener.

public class HolaJavaDay {
 
 private final String mensaje;
 public HolaJavaDay(final String mensaje) {
 this.mensaje = mensaje;
 }
public String getMensaje() {
 return mensaje;
 }
}

Nuestra clase listener u observador, que es la encargada de capturar el evento, es importante saber que hay que especificar que espera un evento asíncrono, esto se logra con @ObservesAsync.

@Stateless
public class listener {
public void listenToHello(@ObservesAsync final HolaJavaDay event){
 System.out.println(“Hola Java: “ + event.getMessage());
 }
}

Y para finalizar nuestra clase disparador, el cual “disparará” el evento, hay que tomar en cuenta que nuestro observador espera un evento asíncrono, por lo que hay que enviar un evento asíncrono, esto se logra con fireAsync.

@Stateless
public class disparador {
 
 @Inject Event<HolaJavaDay> events;
 
 public void saludar() {
 events.fireAsync(new HolaJavaDay(“Hola Mundo Asíncrono”));
 }
}

Espero que les sirva y hasta la próxima. @adiel_l

Fuentes: