前言
項目運行前需安裝好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