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
.
![](https://blog.alexandermiss.com/content/images/2021/02/imagen.png)
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.
![](https://blog.alexandermiss.com/content/images/2021/02/imagen-8.png)
![](https://blog.alexandermiss.com/content/images/2021/02/imagen-9.png)
¡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
![](https://blog.alexandermiss.com/content/images/2021/02/imagen-6.png)
A continuación les muestro mi panel de administración de ActiveMQ con la cola de mensaje en uso.
![](https://blog.alexandermiss.com/content/images/2021/02/imagen-7.png)
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!