Publicación y suscripción de eventos con Guava EventBus en una aplicación Java
Escrito por
el .
java
planeta-codigo
programacion
Enlace permanente
Comentarios
Guava EventBus es una solución simple para la publicación y suscripción de eventos en una misma aplicación y como tal no posee muchas de las capacidades que si tiene JMS o RabbitMQ, sin embargo, en algunos casos puede ser muy útil, una solución sencilla y sin requerimientos adicionales de infraestructura.
En programación los eventos son una buena forma de comunicación que permite desacoplar el emisor del evento del receptor o receptores. Los eventos permiten reaccionar a situaciones que se producen a la aplicación. El emisor los lanza cuando considera adecuado y los receptores se suscriben a los eventos que quieren recibir y actúan según su funcionalidad.
Hay herramientas especificas para eventos en Java está JMS si la aplicación está basada en la plataforma en Java EE, en caso de necesitar un servidor de mensajes adecuado para múltiples plataformas y lenguajes uno de los más conocidos es RabbitMQ. Estas opciones permiten que el emisor y los receptores estén aplicaciones distintas.
En el caso de que el emisor y receptor estén en la misma aplicación una opción más sencilla por no requerir un servidor de mensajería es usando la librería Guava y su funcionalidad de Event Bus. Una de las ventajas de Guava Event Bus es que el receptor no requiere un registro explícito en el emisor como ocurre en algunas de las soluciones con clases Listener de Java.
Para hacer uso de Guava Event Bus hay que obtener una referencia a la clase EventBus que usando Spring se puede definir como un bean singleton en el contenedor de dependencias y ser inyectado en las clases que lo necesiten. Los eventos se envían a haciendo uso del método post() con el objeto que representa el evento como argumento. Los manejadores de los eventos o listener son simplemente un método anotado con @Suscribe y el tipo del evento como argumento, la clases listener han de registrarse en el EventBus y una misma clase con múltiples métodos anotados puede manejar diferentes eventos.
En el contenedor de Spring se define como un bean la clase EventBus que es inicializada con las clases listener con métodos anotados con @Suscribe registradas con el método register().
|
|
|
|
En este ejemplo sencillo se lanza un evento cuando se realiza una petición y como reacción a este evento se imprime un mensaje en la salida. Una aplicación real del EventBus será más complicada pero este ejemplo muestra perfectamente el mecanismo de lanzado y recepción de eventos en una misma aplicación. La clase que se lanza como evento en este caso es un POJO sin ningún requerimiento especial.
|
|
|
|
Al realizar peticiones a la aplicación el controlador emite un evento que es recibido por listener al procesar el evento, en la salida de la aplicación aparecen los mensajes.
|
|
En el proyecto hay que incluir como dependencia la librería Guava en este caso usando Gradle.
|
|
El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:./gradlew run