Directorio de artículos
0. Prefacio
En el último capítulo, aprendimos sobre la instalación del entorno de aprendizaje de RocketMQ y hablamos sobre dos métodos de instalación: 1. Instalación de Docker usando la imagen oficial, 2. Instalación usando el método del código fuente. El tutorial de instalación es el siguiente.
Si ya instaló el entorno de aprendizaje RocketMQ, puede omitir este capítulo."[Práctica (1)] Construcción de un entorno de aprendizaje para comenzar con RocketMQ"
En este capítulo, aprenderemos cómo Spring Boot integra Apache RocketMQ. Y verifique cómo usar el productor Apache RocketMQ (Productor) para enviar mensajes en la aplicación SpringBoot.
Este código implementa los siguientes tipos de envío de mensajes:
Utilice la biblioteca de dependencia oficial de Apache RocketMQ RocketMQTemplate, realizando mensajes sincrónicos, asincrónicos y otros.
Mensaje sincrónico: con
syncSend
este método, el productor esperará una respuesta de confirmación del servidor de mensajes antes de continuar enviando el siguiente mensaje.Mensaje asincrónico: con
asyncSend
este método, el productor no espera a que el servidor responda después de enviar el mensaje, sino que envía directamente el siguiente mensaje.Mensaje unidireccional: al utilizar
sendOneWay
el método, el productor solo es responsable de enviar mensajes, no espera a que el servidor responda y no presta atención a los resultados del envío.Mensajes secuenciales: utilice
sendOrderly
el método para consumir mensajes en el orden en que se envían (primero en entrar, primero en salir).Mensaje retrasado: con
sendDelayed
este método, una vez enviado el mensaje, no se consumirá inmediatamente, sino que esperará un tiempo de retraso específico antes de poder consumirse.Mensajes por lotes: utilice
sendBatch
este método para enviar varios mensajes a la vez, lo que puede mejorar eficazmente el rendimiento del envío.
Con respecto a la introducción y el uso del modelo de mensajes de RocketMQ, escribí un blog específicamente para comprender el
"modelo de transmisión de mensajes de RocketMQ" https://blog.csdn.net/wangshuai6707/article/details/132863088
1. Spring Boot integra los pasos detallados de Apache RocketMQ
1.1 Agregar dependencias
pom.xml
Agregue la dependencia de RocketMQ al archivo del proyecto SpringBoot :
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
<relativePath/>
</parent>
<groupId>com.icepip.project</groupId>
<artifactId>springboot-icepip-rocketMQ-example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-icepip-rocketMQ-example</name>
<description>Spring boot 集成rocketMQ 示例</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
1.2.Configurar RocketMQ
application.properties
Configure la información relacionada con RocketMQ en el archivo :
rocketmq.name-server=你的RocketMQ服务IP:9876
rocketmq.producer.group=my-producer
# 刚开始未配置 导致超时报错
rocketmq.producer.sendMessageTimeout=10000
1.3 Crear productor de mensajes (Productor)
package com.icepip.project.mqtt.controller;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* SpringBoot集成Apache RocketMQ详解
* @author 冰点
* @version 1.0.0
* @date 2023/9/9 17:02
*/
@RestController
@RequestMapping("/producer")
public class ProducerController {
@Autowired
private RocketMQTemplate rocketMQTemplate;
/**
* 同步发送消息到指定主题
* @param message
* @return
*/
@GetMapping("/syncSend")
public String syncSend(String message) {
// 同步发送消息到指定主题
rocketMQTemplate.syncSend("test-topic", message);
return "Sync message: " + message + " sent";
}
/**
* 异步发送消息到指定主题
* @param message
* @return
*/
@GetMapping("/asyncSend")
public String asyncSend(String message) {
// 异步发送消息到指定主题
rocketMQTemplate.asyncSend("test-topic", MessageBuilder.withPayload(message).build(), new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("Async message sent successfully, result: " + sendResult);
}
@Override
public void onException(Throwable throwable) {
System.err.println("Failed to send async message: " + throwable.getMessage());
}
}, 3000, 3); // 3000 ms timeout, delay level 3
return "Async message: " + message + " sent";
}
/**
* 发送单向消息到指定主题,无需等待Broker的确认
* @param message
* @return
*/
@GetMapping("/sendOneWay")
public String sendOneWay(String message) {
// 发送单向消息到指定主题,无需等待Broker的确认
rocketMQTemplate.sendOneWay("test-topic", message);
return "OneWay message: " + message + " sent";
}
// 发送顺序消息
@GetMapping("/sendOrderly")
public String sendOrderly(String message) {
// 发送顺序消息到指定主题
rocketMQTemplate.syncSendOrderly("test-topic", message, "order");
return "Orderly message: " + message + " sent";
}
// 发送延迟消息
@GetMapping("/sendDelayed")
public String sendDelayed(String message) {
// 发送延迟消息到指定主题,延迟级别为3
rocketMQTemplate.syncSend("test-topic", MessageBuilder.withPayload(message).build(), 1000, 3);
return "Delayed message: " + message + " sent";
}
// 发送批量消息
@GetMapping("/sendBatch")
public String sendBatch() {
List<String> messages = new ArrayList<>();
messages.add("message1");
messages.add("message2");
// 批量发送消息到指定主题
rocketMQTemplate.syncSend("test-topic", messages);
return "Batch messages sent";
}
}
1.4 Crear un consumidor de mensajes (Consumidor)
package com.icepip.project.mqtt.handler;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;
/**
* 定义一个消费者,监听test-topic主题的消息
* @author 冰点
* @version 1.0.0
* @date 2023/9/9 16:29
*/
@Service
@RocketMQMessageListener(topic = "test-topic", consumerGroup = "my-consumer_test-topic")
public class MyConsumer implements RocketMQListener<String>{
// 当收到消息时,该方法将被调用
@Override
public void onMessage(String message) {
System.out.println("Received message: "+ message);
}
}
2. Verificación de prueba
3. Errores comunes
- Consulte http://rocketmq.apache.org/docs/faq/ para obtener más detalles.; La excepción anidada es org.apache.rocketmq.client.exception.MQClientException: envío [3] veces, aún falla, costo [6386]ms, tema: tema de prueba, BrokersSent: [698f11314447, 698f11314447, 698f11314447] Ver http:
// rocketmq.apache.org/docs/faq/ para más detalles.] con la causa raíz
org.apache.rocketmq.remoting.exception.RemotingConnectException: falló la conexión a <172.17.0.8:10911>
La solución es modificar la IP del Broker a la IP del host,
ingresar al contenedor para modificar el archivo de configuración e iniciar el servicio después de la modificación . Antes de comenzar, elimine al Broker original en el contenedor.
nohup sh mqbroker -c /home/rocketmq/rocketmq-4.9.2/broker.conf &
4. Documentación de referencia
-
Enlace de documentación oficial: https://rocketmq.apache.org/docs/
-
Enlace de GitHub: https://github.com/apache/rocketmq-spring
5. Dirección del código fuente
Mi github https://github.com/wangshuai67/icepip-springboot-action-examples