En el complejo universo de la mensajería y la integración de sistemas, RabbitMQ destaca como una herramienta robusta que facilita la comunicación eficiente entre aplicaciones distribuidas. Este post te guiará paso a paso a través del proceso de consumir una cola de RabbitMQ con Java 17.
Paso 1: Configuración del Proyecto:
Comencemos creando un nuevo proyecto en Java. Utiliza tu entorno de desarrollo preferido y asegúrate de tener la librería com.rabbitmq.client
en tu configuración de dependencias, nosotros lo haremos con Intelly Idea.
Nos vamos a crear un nuevo proyecto

Nuestro archivo Pom debería tener estas librerías cómo mínimo
<dependencies>
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.20.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>compile</scope>
</dependency>
</dependencies>
Paso 2: Conexión a RabbitMQ y archivo properties:
Crearemos un archivo properties en donde guardaremos todas las variables de conexión a la cola RabbitMQ. El archivo lo llamaremos application.properties y debería tener la siguiente estructura:
rabbit.host=localhost
rabbit.port=5672
rabbit.user=tu_user
rabbit.pass=tu_pass
rabbit.queue=cola_a_consumir
Este archivo lo debemos crear en la carpeta resources
El siguiente paso será crear nuestros packages. En nuestro caso hemos creado 2 packages, consumer y utils, que cuelgan del package principal.

Paso 3: Implementación de las Clases:
Comenzaremos con la clase de properties, con la cual leeremos las variables del archivo properties, esta clase la llamaremos Props.java y la implementaremos de la siguiente manera.
package cl.rabbit.utils;
import lombok.Data;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
@Data
public class Props {
private String host;
private String port;
private String user;
private String pass;
private String queue;
public Props(){
try {
String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
String appConfigPath = rootPath + "application.properties";
//System.out.println(rootPath);
Properties properties= new Properties();
properties.load(new FileInputStream(new File(appConfigPath)));
host = (String) properties.get("rabbit.host");
port = (String) properties.get("rabbit.port");
user = (String) properties.get("rabbit.user");
pass = (String) properties.get("rabbit.pass");
queue = (String) properties.get("rabbit.queue");
vHost = (String) properties.get("rabbit.vHost");
System.out.println(host);
System.out.println(port);
System.out.println(user);
System.out.println(pass);
System.out.println(queue);
System.out.println(vHost);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Paso 4: Consumir Mensajes de la Cola:
Ahora, implementa el consumidor (RabbitConsumer) que estará atento a nuevos mensajes en la cola:
package cl.rabbit.consumer;
import cl.rabbit.utils.Props;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class RabbitConsumer {
private Connection conn = null;
private Props props = new Props();
private Channel channel = null;
public RabbitConsumer(){
try{
if(conn==null){
ConnectionFactory factory = new ConnectionFactory();
factory.setUri("amqp://"+props.getUser()+":"+props.getPass()+"@"+props.getHost()+":"+props.getPort());
conn = factory.newConnection();
}
}catch(Exception e){
e.printStackTrace();
}
}
public void consume() {
try{
channel = conn.createChannel();
boolean autoAck = false;
channel.basicConsume(props.getQueue(), autoAck, "myConsumerTag",
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body)
throws IOException
{
String routingKey = envelope.getRoutingKey();
String contentType = properties.getContentType();
long deliveryTag = envelope.getDeliveryTag();
// (process the message components here ...)
System.out.println(routingKey);
System.out.println(contentType);
System.out.println(deliveryTag);
System.out.println("body " + new String(body, StandardCharsets.UTF_8));
//
channel.basicAck(deliveryTag, false);
}
});
}catch(Exception e){
try {
channel.close();
conn.close();
e.printStackTrace();
}catch(Exception e2){
e2.printStackTrace();
}
}
}
}
Como puedes ver el mensaje llegará en formato byte[], por lo que deberemos transformarlo en String. Una vez que ejecutes el programa este quedará corriendo a la escucha de los mensajes de la cola.
Conclusión:
¡Felicidades! Has creado una aplicación que consume mensajes de una cola RabbitMq con Java 17. Este ejemplo básico sirve como punto de partida para construir sistemas más complejos basados en mensajería. Explora y adapta este código según tus necesidades específicas. La integración de RabbitMQ en aplicaciones Java ofrece una solución robusta para la comunicación eficiente entre componentes distribuidos. ¡Continúa explorando las posibilidades de RabbitMQ en tu desarrollo de software!
Te dejo unos links relaicionados con el tema:
Instalación con docker de RabbitMQ
https://tenocode.com/rabbitmq/
Instalar Docker en Ubuntu