前言
项目运行前需安装好RocketMQ与环境变量配置,对Rocket相关知识不了解的可按照以下文章顺序后再阅读该文:
依赖配置
RocketMQ Producer与Consumer的依赖配置都相同,为了方便环境配置,在root模块添加以下依赖配置进行版本控制:
<properties>
<rockemq-spring.version>2.0.4</rockemq-spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>${rockemq-spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
注:rocketmq-spring-boot-starter 2.0.4版本依赖的RocketMQ版本为4.5.1,故建议安装的RocketMQ客户端版本也为4.5.1避免不必要的错误(如MQClientException)。
Producer模块搭建
-
依赖配置
<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> </dependency> <!-- 用于存放RocketMQ通用配置信息 --> <dependency> <groupId>io.github.wilson-he</groupId> <artifactId>rocket-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
-
application.yml
rocketmq: name-server: 127.0.0.1:9876 producer: group: spring-boot-producer server: port: 9990
-
ProducerApplication
public class ProducerApplication { @Resource private RocketMQTemplate mqTemplate; @GetMapping("/send") public String send(@RequestParam String msg) { mqTemplate.send(RocketConstant.Topic.SPRING_BOOT_TOPIC, MessageBuilder.withPayload(msg).build()); return "success"; } public static void main(String[] args) { SpringApplication.run(ProducerApplication.class, args); } }
RocketMQTemplate可看作RocketMQ生产者(DefaultMQProducer类)在Spring Boot中的快速集成类,其方法都可在DefaultMQProducer中找到匹配的方法(如异步消息、同步消息、事务消息的发送等)。
Consumer模块搭建
-
依赖配置同Producer
-
application.yml
rocketmq: name-server: 127.0.0.1:9876 server: port: 10000
-
ConsumerListener-RocketMQ消息监听器
@Slf4j @RocketMQMessageListener(consumerGroup = RocketConstant.ConsumerGroup.SPRING_BOOT_CONSUMER, topic = RocketConstant.Topic.SPRING_BOOT_TOPIC) @Service public class ConsumerListener implements RocketMQListener<MessageExt> { @Override public void onMessage(MessageExt message) { log.info("msg id: {}, payload: {}", message.getMsgId(), new String(message.getBody())); } }
-
ConsumerApplication
@SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
@RocketMQMessageListener的注解的类相当于一个消费者实例,用于消费实例信息配置,消费消息还需实现RocketMQListener接口进行消息消费操作,@RocketMQMessageListener配置项都可在DefaultMQPushConsumer下找到匹配的配置项,主要配置项如下:
- consumerGroup:消费组名,必须
- topic:主题,必须
- nameServer:名字服务器地址,默认${rocketmq.name-server:},也可通过application.yml配置
- selectorType:消息控制类型,默认TAG,同Topic下的tag
- selectorExpression:tag表达式,默认"*",接收该topic下的所有消息
- consumerThreadMax:消费者最大线程数,默认64
- consumeTimeout:消费超时时间,单位微秒,默认30000(5s)
- …
Common模块
Producer与Consumer的通用配置(如Topic)可以抽出一个通用模块进行维护,当前例子的Common模块比较简单,只负责常量的维护:
public interface RocketConstant {
interface ConsumerGroup {
String SPRING_BOOT_CONSUMER = "spring-boot-consumer";
}
interface Topic {
String SPRING_BOOT_TOPIC = "spring-boot-topic";
}
}
运行测试
- 运行NameServer:
mqnamesrv
- 运行Broker:
mqbroker -n 127.0.0.1:9876
- 运行ConsumerApplication
- 运行ProducerApplication
- 调用ProducerApplication信息发送接口进行测试
(如http://localhost:9990/send?msg=hey RocketMQ
)
附
项目地址:spring-rocketmq