El modo de cola más simple en Java RabbitMQ consta de un productor y un consumidor.

RabbitMQ Simple Queue

Actualmente, las operaciones de Java con RabbitMQ utilizan principalmente el paquete spring-boot-starter-amqp de Spring Boot, que esencialmente utiliza Spring AMQP para operar la cola.

1. Tutorial de Prerrequisitos

Por favor, lee los siguientes capítulos para entender el conocimiento relevante:

2. Paquete de Dependencias

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

3. Configurar RabbitMQ

Modifica la configuración del archivo application.yml:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

4. Declarar Cola

Configura la cola a través de la clase de configuración de Spring Boot:

package com.tizi365.rabbitmq.config;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueueConfig {
    @Bean
    public Queue helloQueue() {
        // Declara la cola, y el nombre de la cola debe ser único
        return new Queue("hello");
    }
}

Consejo: Puedes definir múltiples colas según las necesidades comerciales. El nombre de la cola y el id del bean de la Cola solo necesitan ser diferentes. Aquí, el nombre del método es el id del bean.

5. Enviar Mensaje

Para enviar mensajes, se requiere la clase RabbitTemplate, que Spring Boot ya ha inicializado para nosotros. Solo hay que inyectar la instancia:

package com.tizi365.rabbitmq.service;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class SendService {
    // Inyecta la instancia de RabbitTemplate
    @Autowired
    private RabbitTemplate template;
    
    // Inyecta la cola previamente definida
    @Autowired
    @Qualifier("helloQueue")
    private Queue helloQueue;
    
    // Para fines de demostración, utilizamos la tarea programada incorporada de Spring para enviar mensajes regularmente (un mensaje por segundo)
    @Scheduled(fixedDelay = 1000, initialDelay = 1000)
    public void send() {
        // Contenido del mensaje
        String mensaje = "¡Hola Mundo!";
        // Enviar el mensaje
        // El primer parámetro es la clave de enrutamiento, aquí usamos el nombre de la cola como la clave de enrutamiento
        // El segundo parámetro es el contenido del mensaje, que admite cualquier tipo siempre que admita la serialización
        template.convertAndSend(helloQueue.getName(), mensaje);
        System.out.println("Enviando mensaje '" + mensaje + "'");
    }
}

Consejo: Aquí, no estamos utilizando directamente el intercambio. Se usará el intercambio predeterminado subyacente (intercambio directo).

6. Recibir Mensaje

También es sencillo para el consumidor recibir mensajes:

package com.tizi365.rabbitmq.listener;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
// Declara el escuchador de mensajes, especifica la cola a la que escuchar a través del parámetro `queues`, que debe ser consistente con el nombre de la cola anterior
@RabbitListener(queues = "hello")
public class HelloListener {
	// Utiliza RabbitHandler para marcar el manejador de mensajes, utilizado para ejecutar la lógica de procesamiento de mensajes
    @RabbitHandler
    public void recibir(String msg) {
        System.out.println("Consumidor - Recibido mensaje '" + msg + "'");
    }
}

7. Tipo de Mensaje Personalizado

Anteriormente, enviamos un mensaje de tipo cadena. En escenarios comerciales reales, preferiríamos enviar directamente varios tipos de objetos Java personalizados.

Definir un objeto de entidad

package com.tizi365.rabbitmq.domain;

import java.io.Serializable;
import lombok.Data;

// Contenido del blog
@Data
public class Blog implements Serializable {
    // id
    private Integer id;
    // título
    private String titulo;
}

Enviar mensajes de tipo personalizado

Blog blog = new Blog();
blog.setId(100);
blog.setTitulo("Tutorial de Tizi365 RabbitMQ");

// Enviar mensaje
template.convertAndSend(helloQueue.getName(), blog);

Recibir mensajes de tipo personalizado

@RabbitHandler
// Simplemente cambia el parámetro del método al tipo de mensaje personalizado
public void receive(Blog msg) {
    System.out.println("Consumidor - Recibido el mensaje '" + msg.getTitle() + "'");
}

Utilizar la serialización JSON para el contenido del mensaje

Cuando RabbitMQ envía datos de objetos de entidad Java, por defecto utiliza la herramienta de serialización de objetos de la JDK. Podemos cambiarlo para usar el formato JSON para la serialización de datos, lo que permite que otros lenguajes consuman los mensajes enviados por Java y hace que el formato del mensaje sea más legible.

Modifica la clase de configuración anterior y agrega la siguiente configuración para usar el analizador JSON de Jackson para la serialización y deserialización de datos del mensaje.

@Bean
public Jackson2JsonMessageConverter messageConverter() {
    // Establecer el conversor de mensajes predeterminado
    return new Jackson2JsonMessageConverter();
}