📢 技术人必备!关注我的公众号 👉 「老王的技术时光」
🚀 每天分享:最新技术干货 | 实战经验 | 行业趋势 | 个人成长
💡 助你提升:编程技巧 | 架构设计 | 面试心得 | 学习方法
👉 立即关注,订阅获取每周更多精彩内容,持续干货,等你来拿!
🔗 点击这里查看公众号精选文章
🔗 本文公众号链接
一、快速实战:使用Spring Boot与RocketMQ集成
在本节中,我们将通过Spring Boot快速创建一个RocketMQ客户端。以下是如何配置Maven工程并引入必要的依赖。
1. 引入依赖
本示例使用的是 Spring Boot 3.0.4,RocketMQ的Spring Boot Starter版本为 2.3.1。为了确保客户端与服务端版本兼容,我们排除了默认的RocketMQ客户端依赖,并手动引入与Broker相同版本的客户端依赖。请注意,官方并未明确指定Spring Boot与RocketMQ整合的特定版本兼容性,因此在选择版本时需要谨慎。
注意:Spring Boot 3.0.4版本要求JDK版本为17或以上。
<dependencies>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.3.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
2. 启动类
创建一个简单的 Spring Boot 启动类:
@SpringBootApplication
public class RocketMQSBApplication {
public static void main(String[] args) {
SpringApplication.run(RocketMQSBApplication.class, args);
}
}
3. 配置文件
在 application.properties
中配置 RocketMQ:
rocketmq.name-server=127.0.0.1:9876
rocketmq.producer.group=springBootGroup
rocketmq.consumer.group=testGroup
server.port=9000
4. 生产者实现
声明生产者,直接使用RocketMQTemplate进行消息发送。
package com.roy.rocketmq.basic;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class SpringProducer {
@Resource
private RocketMQTemplate rocketMQTemplate;
public void sendMessage(String topic, String msg) {
this.rocketMQTemplate.convertAndSend(topic, msg);
}
}
5. 消费者实现
消费者的声明也很简单。所有属性通过@RocketMQMessageListener注解声明。
@Component
@RocketMQMessageListener(consumerGroup = "MyConsumerGroup", topic = "TestTopic", consumeMode = ConsumeMode.CONCURRENTLY, messageModel = MessageModel.BROADCASTING)
public class SpringConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.println("Received message: " + message);
}
}
注意:Spring Boot中对消息的封装与RocketMQ原生API不同,需适应这一封装方式。
二、如何处理不同消息类型
1. 基础消息发送
基础的消息发送机制可以参考 com.roy.rocketmq.SpringRocketTest
单元测试类。
2. 多个Topic消息发送
RocketMQTemplate
实例仅支持发送单一Topic的消息。如果你需要发送至多个Topic,可以通过 @ExtRocketMQTemplateConfiguration()
注解声明不同的 RocketMQTemplate
实例。
3. 事务消息机制
对于事务消息,我们需要使用 @RocketMQTransactionListener
注解将事务监听器注入到Spring容器中,在这个注解当中可以通过rocketMQTemplateBeanName
属性,指向具体的RocketMQTemplate子类。
三、实现原理
1. RocketMQTemplate
RocketMQTemplate
是 RocketMQ 与 Spring Boot 集成的核心组件,注入过程可以参考 org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration
类。不同的集成版本可能不太相同,但大致基本不变。
@Configuration
@EnableConfigurationProperties({
RocketMQProperties.class})
@ConditionalOnClass({
MQAdmin.class})