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.
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
.
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.
¡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
A continuación les muestro mi panel de administración de ActiveMQ con la cola de mensaje en uso.
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!