说来也奇怪,RocketMQ 不能很好的兼容Springboot3,刚开始上手Springboot3集成RocketMQ会发现总是不能实例化RocketMQTemplate,老是启动时报错。本项目采用Springboot3,JDK21 ,Maven 3.9,提供一个非常简单的示例。
案例就只有这5个类,没有建package。
提前工作
我的RocketMQ服务部署在虚拟机Linux服务器,ip地址是 192.168.218.128
,Linux部署RocketMQ比较简单。
运行Springboot3项目之前,需要先把Linux中 mqnamesrv
和mqbroker
两个服务启动起来。
引入依赖
注意rocketmq-spring-boot-starter版本 2.3.1 不要改动,目前2.3.1版本可以兼容5.3.1,其他版本可能出现注入IOC容器失败。
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
yaml中添加RocketMQ配置信息
配置类 application.yaml
,注意rocketmq
标签不是 spring
标签的子标签,二者是并立的。
spring:
application:
name: rocketmq-demo
rocketmq:
name-server: 192.168.218.128:9876
# 必须初始化生产者,才会实例化RocketMQTemplate
producer:
group: producer-group
consumer:
group: consumer-group
// 配置后端服务端口是8081
server:
port: 8081
建立配置类
手动配置RocketMQConfig
注入:配置 RocketMQ 消息中间件的相关参数,并通过 Spring 的依赖注入机制将其集成到 Spring Boot 应用程序中。
@Configuration
public class RocketMQConfig {
@Value("${rocketmq.name-server}")
private String nameServer;
@Value("${rocketmq.producer.group}")
private String producerGroup;
@Bean
public RocketMQTemplate rocketMQTemplate() {
RocketMQTemplate rocketMQTemplate = new RocketMQTemplate();
DefaultMQProducer defaultMQProducer = new DefaultMQProducer();
defaultMQProducer.setProducerGroup(producerGroup);
defaultMQProducer.setNamesrvAddr(nameServer);
rocketMQTemplate.setProducer(defaultMQProducer);
return rocketMQTemplate;
}
}
创建生产者
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author 10463
*/
@Service
public class RocketMQProducer {
@Autowired
private RocketMQTemplate rocketMQTemplate;
public void sendMessage(String topic, String message) {
rocketMQTemplate.convertAndSend(topic, message);
}
}
创建消费者
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* @author 10463
*/
@Component
@Service
@RocketMQMessageListener(topic = "test-topic", consumerGroup = "consumer-group")
public class RocketMQConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
System.out.println("消费者收到 message: " + message);
}
}
创建控制类
@Controller
public class MessageController {
@Autowired
private RocketMQProducer rocketMQProducer;
@GetMapping("/sendMessage")
public String sendMessage(@RequestParam(value = "message", required = true) String message) {
System.out.println("进入方法");
rocketMQProducer.sendMessage("test-topic", message);
return "消息发送成功";
}
}
测试
启动Application
类,代码如下,我没有添加任何额外注解:
@SpringBootApplication
public class MqServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MqServiceApplication.class, args);
}
}
使用postMan ,执行GET 请求模拟:
http://localhost:8081/sendMessage?message=HelloRocketMQ
没有postman也没关系,直接在网址中复制回车。
如果部署没问题,在控制台会输出
进入方法
消费者收到 message: HelloRocketMQ
该案例没有任何复杂注解和层级关系,部署成功后可以进行后续的复杂RocketMQ学习。