Spring Boot: JMS con ActiveMQ

ActiveMQ es un broker de mensajería de código abierto utilizado en muchas aplicaciones para comunicarse entre sí y compartir datos.

Spring Boot: JMS con ActiveMQ

Si tienes la necesidad de enviar correos electrónicos, generar reportes estadísticos con una cantidad inmensa de registros o hacer cualquier proceso asíncrono que no requiera un respuesta inmediata, puede que ésta sea tu solución.

Requerimientos

Programa Versión
Docker 20.10.2
Java 8
Spring Boot 2.4.2

Instalación de ActiveMQ

Para éste ejemplo usaremos la siguiente imagen docker.

docker run -p 61616:61616 -p 8161:8161 rmohr/activemq

Comprueba la instalación entrando a la consola web de ActiveMQ en el puerto 8161.

Panel de administracion de ActiveMQ

Para entrar al panel de administración, el usuario y contraseña por defecto es admin.


Creación de los proyectos

Para éstos ejemplos usaremos dos aplicaciones y las definimos de la siguiente manera.

Proyecto de Spring boot Descripción
Sender Enviará los mensajes a listener
Listener Recibirá los mensajes de sender

Creamos dos aplicaciones en spring initializr a como se muestra en las imágenes.

Ten en cuenta que debemos seleccionar la dependencia Apache ActiveMQ 5.

Nuestra aplicación sender enviará los mensajes

Nuestra aplicación listener recibirá los mensajes

¡Ya estamos listos para escribir código!


Ejemplo básico con nuestras dos aplicaciones.

Aplicación Sender

Para éste ejemplo crearemos una tarea que se ejecutará cada 5 segundos y enviaremos nuestro mensaje a la aplicación listener.

Crea una carpeta tasks y dentro, un archivo MensajeAutoTask.java.

Observa que tiene la anotación @Service y usamos la anotación @EnableScheduling para habilitar la ejecución de tareas.

// MensajeAutoTask.java

package com.broker.sender.task;

import org.springframework.beans.factory.annotation.*;
import org.springframework.jms.core.*;
import org.springframework.scheduling.annotation.*;
import org.springframework.stereotype.*;

@EnableScheduling
@Service
public class MensajeAutoTask {

    @Autowired
    private JmsTemplate jmsTemplate;

    @Scheduled(fixedRate = 5000)
    private void enviarMensaje(){
        jmsTemplate.convertAndSend("mensaje", "hola");
    }
}

Aplicación Listener

Crea una clase que tendrá la anotación @Service, ésta escuchará nuestros mensajes.

// MensajeListener.java

package com.broker.listener.activemq;

import org.springframework.jms.annotation.*;
import org.springframework.stereotype.*;

@Service
public class MensajeListener {

    @JmsListener(destination = "mensaje")
    public void recibirMensaje(String mensaje) {
        LOG.info("Mensaje recibido: {}", mensaje);
    }

}

Como último paso, nos falta configurar las credenciales de ActiveMQ en nuestros dos proyectos.

# application.properties

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=guest
spring.activemq.password=guest

En el ejemplo usamos un destino llamado "mensaje". Tú puedes elegir el nombre que desees siempre y cuando describa de manera específica o general lo que necesitas realizar: enviar-correo, registrar-usuario, nuevo-usuario, etc.

Y aquí veremos nuestras aplicaciones funcionando, los mensajes nos llegan cada 5 segundos

Ejemplo de entrega de mensaje con ActiveMQ

A continuación les muestro mi panel de administración de ActiveMQ con la cola de mensaje en uso.

Queue: Mensaje funcionando con Spring Boot

En la siguiente publicación haremos una aplicación que usaremos para envíos de correo electrónico que implemente JMS usando Spring Boot.

Happy Coding!