El modo de cola más simple en Java RabbitMQ consta de un productor y un consumidor.
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();
}