Proyecto de ejemplo construido con Spring Boot y ActiveMQ para enviar y recibir mensajes JMS, incluyendo una configuración base para credenciales protegidas y pruebas simples de mensajería.
Este repositorio implementa una integración básica con ActiveMQ usando Spring JMS.
La aplicación expone un endpoint REST para enviar mensajes a una cola, y además incluye un @JmsListener para consumir mensajes desde otra cola.
También incorpora una base para trabajar con credenciales encriptadas dentro del archivo de propiedades.
El objetivo principal de este proyecto es demostrar:
- cómo integrar Spring Boot con ActiveMQ
- cómo enviar mensajes a una cola usando
JmsTemplate - cómo consumir mensajes con
@JmsListener - cómo externalizar la configuración del broker
- cómo preparar el proyecto para manejar credenciales encriptadas en
application.properties
- Java 25
- Spring Boot
- Spring Web
- Spring JMS
- ActiveMQ
- Lombok
- Maven
- Jasypt Spring Boot Starter
Cliente REST
|
v
MiControllerMQ
|
v
ISendMessage / ISendMessageImpl
|
v
JmsTemplate
|
v
ActiveMQ Queue
ActiveMQ Queue --> @JmsListener --> aplicación
Clase principal de arranque de Spring Boot.
Responsabilidad:
- iniciar la aplicación
- levantar el contexto Spring
- habilitar la configuración general del proyecto
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}Clase de configuración encargada de registrar los beans necesarios para trabajar con JMS.
Responsabilidades:
- habilitar JMS con
@EnableJms - construir el
ActiveMQConnectionFactory - configurar
broker-url, usuario y contraseña - exponer un bean
JmsTemplate
@Configuration
@EnableJms
public class ActiveMQConfig {
@Value("${spring.activemq.broker-url}")
private String url;
@Value("${spring.activemq.user}")
private String user;
@Value("${spring.activemq.password}")
private String password;
@Bean
ActiveMQConnectionFactory connectionFactory(){
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL(url);
connectionFactory.setUserName(user);
connectionFactory.setPassword(password);
return connectionFactory;
}
@Bean
JmsTemplate jmsTemplate(){
return new JmsTemplate(connectionFactory());
}
}El código deja preparada la posibilidad de desencriptar usuario y contraseña antes de crear la conexión:
//connectionFactory.setUserName(EncryptUtils.desencriptar(user));
//connectionFactory.setPassword(EncryptUtils.desencriptar(password));Esto permite almacenar credenciales protegidas en application.properties y desencriptarlas al momento de inicializar el ConnectionFactory.
Controlador REST que expone endpoints para interactuar con la lógica de mensajería.
Responsabilidades:
- recibir mensajes HTTP
- delegar el envío del mensaje al servicio
- ofrecer un endpoint auxiliar para desencriptar texto
Endpoints:
POST /v1/activemq/sendMessageGET /v1/activemq/desencriptar
@RestController
@RequestMapping("/v1/activemq")
@RequiredArgsConstructor
@Log4j2
public class MiControllerMQ {
private final ISendMessage isendMessage;
@PostMapping("/sendMessage")
public void sendMessage(@RequestBody MessageDTO message) {
log.info("Mensaje recibido : {}" , message);
isendMessage.sendMessageMQ(message);
}
@GetMapping("/desencriptar")
public String desencriptar() {
return EncryptUtils.desencriptar("UyF181v+vWv1IcK8bqHKi2CZpOHJ4R9Ve0njg/kSZCQKXaQdnkTr6YrL/62J1q6Q");
}
}Interfaz que define el contrato del servicio de mensajería.
public interface ISendMessage {
void sendMessageMQ(MessageDTO message);
}Implementación del servicio de mensajería.
Responsabilidades:
- enviar mensajes a la cola
testQueue - consumir mensajes desde la cola
testQueue2 - registrar logs del envío y de la recepción
@Service
@RequiredArgsConstructor
@Slf4j
public class ISendMessageImpl implements ISendMessage {
private final JmsTemplate jmsTemplate;
@Override
public void sendMessageMQ(MessageDTO message) {
sendMessage("testQueue", message.toString());
}
public void sendMessage(String destination, String message) {
log.info("ENVIANDO MENSAJE A COLA: " + destination + " , message: " + message);
jmsTemplate.convertAndSend(destination, message);
}
@JmsListener(destination = "testQueue2")
public void receiveMessage(String message) {
log.info("MENSAJE RECIBIDO EN LISTENER: {}", message);
}
}- el cliente invoca el endpoint REST
POST /v1/activemq/sendMessage - el controlador recibe un
MessageDTO - el servicio transforma el mensaje a texto
JmsTemplateenvía el mensaje a la colatestQueue
- ActiveMQ entrega un mensaje en
testQueue2 - Spring detecta el mensaje mediante
@JmsListener - el método
receiveMessageprocesa el contenido - se registra el mensaje recibido en logs
POST /is-mq-test/v1/activemq/sendMessage
Ejemplo:
curl --location 'http://localhost:8080/is-mq-test/v1/activemq/sendMessage' \
--header 'Content-Type: application/json' \
--data '{
"message": "Hola mundo"
}'El JSON exacto depende de la estructura de tu
MessageDTO.
GET /is-mq-test/v1/activemq/desencriptar
Este endpoint está pensado como utilidad de prueba para verificar la desencriptación configurada en EncryptUtils.
server.port:8080
spring.application.name=is-mq-test
server.servlet.context-path=/is-mq-test
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=UyF181v+vWv1IcK8bqHKi2CZpOHJ4R9Ve0njg/kSZCQKXaQdnkTr6YrL/62J1q6Q
spring.activemq.password=UyF181v+vWv1IcK8bqHKi2CZpOHJ4R9Ve0njg/kSZCQKXaQdnkTr6YrL/62J1q6Q
spring.activemq.packages.trust-all=trueserver.port:8080: puerto de la aplicaciónspring.application.name=is-mq-test: nombre lógico de la appserver.servlet.context-path=/is-mq-test: prefijo global de los endpointsspring.activemq.broker-url=tcp://localhost:61616: URL del broker ActiveMQspring.activemq.user: usuario del brokerspring.activemq.password: contraseña del brokerspring.activemq.packages.trust-all=true: permite confiar en todos los paquetes para deserialización
En ambientes reales,
trust-all=truedebe evaluarse con cuidado por motivos de seguridad.
El proyecto incluye la dependencia:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>Además, la clase ActiveMQConfig deja preparada la opción de desencriptar usuario y contraseña antes de crear la conexión con ActiveMQ.
- evitar credenciales en texto plano
- aumentar la seguridad del archivo
application.properties - facilitar una transición futura hacia una solución más estándar de secretos
Actualmente en tu código la desencriptación está comentada, por lo que la conexión usa directamente los valores cargados en propiedades:
connectionFactory.setUserName(user);
connectionFactory.setPassword(password);Si querés usar credenciales desencriptadas en tiempo de ejecución, deberías activar estas líneas:
connectionFactory.setUserName(EncryptUtils.desencriptar(user));
connectionFactory.setPassword(EncryptUtils.desencriptar(password));testQueue
Es la cola a la que la aplicación envía mensajes cuando se invoca el endpoint REST.
testQueue2
Es la cola monitoreada por el método anotado con @JmsListener.
INFO Mensaje recibido : MessageDTO(...)
INFO ENVIANDO MENSAJE A COLA: testQueue , message: ...
INFO MENSAJE RECIBIDO EN LISTENER: ...
En tu comentario de código se indica una configuración necesaria en activemq.xml para habilitar usuarios distintos al acceso del panel administrativo.
Ejemplo:
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="admin" password="admin" groups="admins,users"/>
</users>
</simpleAuthenticationPlugin>
</plugins>Esto permite que el broker tenga usuarios válidos para autenticación JMS.
El proyecto utiliza estas dependencias destacadas:
spring-boot-starter-activemqspring-boot-starter-webspring-boot-starterspring-boot-starter-testspring-boot-devtoolslombokjasypt-spring-boot-starter
- integración simple entre Spring Boot y ActiveMQ
- separación clara entre controlador, servicio y configuración
- soporte para envío y consumo de mensajes
- configuración externalizada del broker
- base preparada para uso de credenciales encriptadas
- ejemplo útil para pruebas y aprendizaje de JMS
- el endpoint
/desencriptarparece pensado para pruebas; no conviene exponerlo en producción trust-all=truees cómodo para desarrollo, pero debe revisarse en ambientes reales- actualmente el productor envía a
testQueuey el listener escuchatestQueue2; eso significa que no estás consumiendo automáticamente el mismo mensaje enviado - si querés hacer una prueba completa de envío y recepción dentro de la misma app, podrías usar la misma cola en ambos lados
- conviene reemplazar concatenaciones en logs por placeholders de SLF4J/Log4j2
Ejemplo mejorado del log de envío:
log.info("Enviando mensaje a cola: {}, contenido: {}", destination, message);mvn spring-boot:runEl broker debe estar disponible en:
tcp://localhost:61616
Este proyecto es una demo clara para entender cómo integrar Spring Boot con ActiveMQ usando JMS.
Permite ver de forma práctica:
- configuración de conexión al broker
- envío de mensajes con
JmsTemplate - recepción con
@JmsListener - externalización de propiedades
- preparación para manejo de credenciales encriptadas
Es una buena base para evolucionar hacia soluciones más robustas de mensajería empresarial.