Explicación detallada de la integración de SpringBoot con Apache RocketMQ


Insertar descripción de la imagen aquí

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.

  1. Mensaje sincrónico: con syncSendeste método, el productor esperará una respuesta de confirmación del servidor de mensajes antes de continuar enviando el siguiente mensaje.

  2. Mensaje asincrónico: con asyncSendeste 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.

  3. Mensaje unidireccional: al utilizar sendOneWayel 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.

  4. Mensajes secuenciales: utilice sendOrderlyel método para consumir mensajes en el orden en que se envían (primero en entrar, primero en salir).

  5. Mensaje retrasado: con sendDelayedeste método, una vez enviado el mensaje, no se consumirá inmediatamente, sino que esperará un tiempo de retraso específico antes de poder consumirse.

  6. Mensajes por lotes: utilice sendBatcheste 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.xmlAgregue 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.propertiesConfigure 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

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

3. Errores comunes

  1. 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 &
Insertar descripción de la imagen aquí

4. Documentación de referencia

  1. Enlace de documentación oficial: https://rocketmq.apache.org/docs/

  2. 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

Supongo que te gusta

Origin blog.csdn.net/wangshuai6707/article/details/132778960
Recomendado
Clasificación