Explicação detalhada da integração do SpringBoot com Apache RocketMQ


Insira a descrição da imagem aqui

0. Prefácio

No último capítulo, aprendemos sobre a instalação do ambiente de aprendizagem do RocketMQ e falamos sobre dois métodos de instalação: 1. Instalação do Docker usando a imagem oficial, 2. Instalação usando o método do código-fonte. O tutorial de instalação é o seguinte
Se você já instalou o ambiente de aprendizagem RocketMQ, pode pular este capítulo."[Prática (1)] Construção de ambiente de aprendizagem para introdução ao RocketMQ"
Neste capítulo, aprendemos como o Spring Boot integra o Apache RocketMQ. E verifique como utilizar o produtor Apache RocketMQ (Producer) para enviar mensagens na aplicação SpringBoot.
Este código implementa os seguintes tipos de envio de mensagens:
Use a biblioteca de dependência oficial do Apache RocketMQ RocketMQTemplate, realizando mensagens síncronas, assíncronas e outras.

  1. Mensagem síncrona: Usando syncSendeste método, o produtor aguardará uma resposta de confirmação do servidor de mensagens antes de continuar a enviar a próxima mensagem.

  2. Mensagem assíncrona: usando asyncSendeste método, o produtor não espera a resposta do servidor após enviar a mensagem, mas envia diretamente a próxima mensagem.

  3. Mensagem unidirecional: Utilizando sendOneWayo método, o produtor é responsável apenas pelo envio das mensagens, não espera a resposta do servidor e não presta atenção aos resultados do envio.

  4. Mensagens sequenciais: Utilize sendOrderlyo método para consumir mensagens na ordem em que são enviadas (Primeiro que Entra, Primeiro que Sai).

  5. Mensagem atrasada: Usando sendDelayedeste método, após o envio da mensagem, ela não será consumida imediatamente, mas aguardará um tempo de atraso específico antes de poder ser consumida.

  6. Mensagens em lote: use sendBatcheste método para enviar várias mensagens ao mesmo tempo, o que pode efetivamente melhorar o rendimento do envio.

Em relação à introdução e uso do modelo de mensagens RocketMQ, escrevi um blog especificamente para construir uma compreensão do
"modelo de passagem de mensagens RocketMQ" https://blog.csdn.net/wangshuai6707/article/details/132863088

1. Spring Boot integra etapas detalhadas do Apache RocketMQ

1.1. Adicionar dependências

pom.xmlAdicione a dependência RocketMQ ao arquivo de projeto 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.Configurando RocketMQ

application.propertiesConfigure as informações relacionadas ao RocketMQ no arquivo :

rocketmq.name-server=你的RocketMQ服务IP:9876
rocketmq.producer.group=my-producer
# 刚开始未配置 导致超时报错
rocketmq.producer.sendMessageTimeout=10000

1.3. Crie um produtor de mensagens (Produtor)

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. Crie um consumidor de mensagem (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. Verificação de teste

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

3. Erros comuns

  1. Consulte http://rocketmq.apache.org/docs/faq/ para obter mais detalhes.; exceção aninhada é org.apache.rocketmq.client.exception.MQClientException: Envio [3] vezes, ainda falhou, custo [6386]ms, Tópico: tópico de teste, BrokersSent: [698f11314447, 698f11314447, 698f11314447] Consulte http:
    // rocketmq.apache.org/docs/faq/ para mais detalhes.] com causa raiz

org.apache.rocketmq.remoting.exception.RemotingConnectException: conexão com <172.17.0.8:10911> falhou
A solução é modificar o IP do Broker para o IP do host,
inserir o contêiner para modificar o arquivo de configuração e iniciar o serviço após a modificação . Antes de começar, mate o Broker original no contêiner.
nohup sh mqbroker -c /home/rocketmq/rocketmq-4.9.2/broker.conf &
Insira a descrição da imagem aqui

4. Documentação de referência

  1. Link da documentação oficial: https://rocketmq.apache.org/docs/

  2. Link do GitHub: https://github.com/apache/rocketmq-spring

5. Endereço do código-fonte

Meu github https://github.com/wangshuai67/icepip-springboot-action-examples

Acho que você gosta

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