Skip to content

cortizmardones/SpringBootWithBrokerApacheActiveMQ

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📬 Demo Spring Boot + ActiveMQ

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.


📌 Resumen

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.


🎯 Objetivo del proyecto

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

🧱 Stack tecnológico

  • Java 25
  • Spring Boot
  • Spring Web
  • Spring JMS
  • ActiveMQ
  • Lombok
  • Maven
  • Jasypt Spring Boot Starter

🏗️ Arquitectura simple

Cliente REST
   |
   v
MiControllerMQ
   |
   v
ISendMessage / ISendMessageImpl
   |
   v
JmsTemplate
   |
   v
ActiveMQ Queue

ActiveMQ Queue --> @JmsListener --> aplicación

📂 Estructura principal

DemoApplication

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);
	}

}

ActiveMQConfig

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());
    }

}

Nota importante sobre seguridad

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.


MiControllerMQ

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/sendMessage
  • GET /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");
	}
}

ISendMessage

Interfaz que define el contrato del servicio de mensajería.

public interface ISendMessage {
	
	void sendMessageMQ(MessageDTO message);

}

ISendMessageImpl

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);
	}

}

🧠 Flujo funcional

Envío de mensaje

  1. el cliente invoca el endpoint REST POST /v1/activemq/sendMessage
  2. el controlador recibe un MessageDTO
  3. el servicio transforma el mensaje a texto
  4. JmsTemplate envía el mensaje a la cola testQueue

Recepción de mensaje

  1. ActiveMQ entrega un mensaje en testQueue2
  2. Spring detecta el mensaje mediante @JmsListener
  3. el método receiveMessage procesa el contenido
  4. se registra el mensaje recibido en logs

🚀 Endpoints disponibles

Enviar mensaje

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.


Desencriptar texto

GET /is-mq-test/v1/activemq/desencriptar

Este endpoint está pensado como utilidad de prueba para verificar la desencriptación configurada en EncryptUtils.


⚙️ Configuración relevante

application.properties

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=true

Explicación rápida

  • server.port:8080: puerto de la aplicación
  • spring.application.name=is-mq-test: nombre lógico de la app
  • server.servlet.context-path=/is-mq-test: prefijo global de los endpoints
  • spring.activemq.broker-url=tcp://localhost:61616: URL del broker ActiveMQ
  • spring.activemq.user: usuario del broker
  • spring.activemq.password: contraseña del broker
  • spring.activemq.packages.trust-all=true: permite confiar en todos los paquetes para deserialización

En ambientes reales, trust-all=true debe evaluarse con cuidado por motivos de seguridad.


🔐 Manejo de credenciales encriptadas

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.

¿Qué busca esta implementación?

  • 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

Comentario práctico

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));

📨 Colas utilizadas

Cola de envío

testQueue

Es la cola a la que la aplicación envía mensajes cuando se invoca el endpoint REST.

Cola de recepción

testQueue2

Es la cola monitoreada por el método anotado con @JmsListener.


📝 Logs esperados

Cuando se envía un mensaje

INFO Mensaje recibido : MessageDTO(...)
INFO ENVIANDO MENSAJE A COLA: testQueue , message: ...

Cuando se recibe un mensaje en el listener

INFO MENSAJE RECIBIDO EN LISTENER: ...

🛠️ Configuración de usuarios en ActiveMQ

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.


📦 Dependencias principales

El proyecto utiliza estas dependencias destacadas:

  • spring-boot-starter-activemq
  • spring-boot-starter-web
  • spring-boot-starter
  • spring-boot-starter-test
  • spring-boot-devtools
  • lombok
  • jasypt-spring-boot-starter

✅ Beneficios de esta implementación

  • 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

⚠️ Consideraciones importantes

  • el endpoint /desencriptar parece pensado para pruebas; no conviene exponerlo en producción
  • trust-all=true es cómodo para desarrollo, pero debe revisarse en ambientes reales
  • actualmente el productor envía a testQueue y el listener escucha testQueue2; 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);

▶️ Ejecución del proyecto

Levantar la aplicación

mvn spring-boot:run

Verificar que ActiveMQ esté disponible

El broker debe estar disponible en:

tcp://localhost:61616

📚 Conclusión

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.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages