springboot 3.x 整合 RocketMQ 5.x的詳細(xì)過(guò)程
RocketMQ 5.x在SpringBoot中的上手使用過(guò)程
注意:rocketmq-v5-client-spring-boot-starter對(duì)springboot版本有要求,至少2.0.6.RELEASE版本的springboot無(wú)法整合。
準(zhǔn)備環(huán)境
- JDK 17
- Spring Boot 3.2.3
- RocketMQ(服務(wù)端) 5.3.1
- rocketmq-v5-client-spring-boot-starter(客戶(hù)端) 2.3.1
在 SpringBoot 項(xiàng)目中依賴(lài)如下配置:
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-v5-client-spring-boot-starter</artifactId>
<version>2.3.1</version>
</dependency>如果還未搭建服務(wù)端,可以先看第5節(jié)-服務(wù)器環(huán)境搭建。
參數(shù)配置
按照 SpringBoot 的約定習(xí)俗,在上手一個(gè)新的 spring-boot-starter項(xiàng)目時(shí),想要知道怎么使用它,看它的 AutoConfiguration 就對(duì)了。
在 rocketmq-v5-client-spring-boot中,對(duì)應(yīng)的 AutoConfiguration 類(lèi)為 RocketMQAutoConfiguration,其類(lèi)定義部分代碼如下:
@Configuration
@EnableConfigurationProperties(RocketMQProperties.class)
@Import({MessageConverterConfiguration.class, ListenerContainerConfiguration.class, ExtTemplateResetConfiguration.class,
ExtConsumerResetConfiguration.class, RocketMQTransactionConfiguration.class, RocketMQListenerConfiguration.class})
@AutoConfigureAfter({MessageConverterConfiguration.class})
@AutoConfigureBefore({RocketMQTransactionConfiguration.class})
public class RocketMQAutoConfiguration implements ApplicationContextAware {
// ... 省略
@Bean(PRODUCER_BUILDER_BEAN_NAME)
@ConditionalOnMissingBean(ProducerBuilderImpl.class)
@ConditionalOnProperty(prefix = "rocketmq", value = {"producer.endpoints"})
public ProducerBuilder producerBuilder(RocketMQProperties rocketMQProperties) {
// ... 省略
}
@Bean(SIMPLE_CONSUMER_BUILDER_BEAN_NAME)
@ConditionalOnMissingBean(SimpleConsumerBuilder.class)
@ConditionalOnProperty(prefix = "rocketmq", value = {"simple-consumer.endpoints"})
public SimpleConsumerBuilder simpleConsumerBuilder(RocketMQProperties rocketMQProperties) {
// ... 省略
}
@Bean(destroyMethod = "destroy")
@Conditional(ProducerOrConsumerPropertyCondition.class)
@ConditionalOnMissingBean(name = ROCKETMQ_TEMPLATE_DEFAULT_GLOBAL_NAME)
public RocketMQClientTemplate rocketMQClientTemplate(RocketMQMessageConverter rocketMQMessageConverter) {
// ... 省略
}
}可以發(fā)現(xiàn),在rocketmq-v5-client-spring-boot中,根據(jù) RocketMQ 5.x 在架構(gòu)上做的改進(jìn),使用了 endpoints 來(lái)替代傳統(tǒng)的 namesrvAddr,以支持更靈活的網(wǎng)絡(luò)拓?fù)浜驮圃軜?gòu)。endpoints 通常指向 RocketMQ 的 Broker 或 Nameserver 地址,用于生產(chǎn)者與 RocketMQ 集群建立連接。endpoints 是一個(gè) URL 或 IP 地址(ip:host)列表(使用;分割)。
??注意:在 RocketMQ 5.x 中,現(xiàn)已默認(rèn)使用gRPC作為通信協(xié)議,entpoints更建議指向 Proxy 地址,一般默認(rèn)端口為8081。
因此,現(xiàn)在想要啟用默認(rèn)的生產(chǎn)者(ProducerBuilder),只需要配置rocketmq.producer.endpoints即可。
想要啟用默認(rèn)的消費(fèi)者(SimpleConsumerBuilder),只需要配置rocketmq.simple-consumer.endpoints即可。
而RocketMQClientTemplate則是通過(guò)判斷當(dāng)前應(yīng)用上下文是否含有ProducerBuilder或SimpleConsumerBuilder Bean對(duì)象生成而來(lái)。它屬于rocketmq-v5-client-spring-boot模塊下,也就是說(shuō)它利用了Spring特性,提供了Spring風(fēng)格的API,方便開(kāi)發(fā)者通過(guò) Spring 的編程模型來(lái)進(jìn)行消息發(fā)送和接收。
既然是原生態(tài)的簡(jiǎn)易使用教程,那么就盡可能在不寫(xiě)多的代碼的情況下,實(shí)現(xiàn)生產(chǎn)環(huán)境中使用MQ。
因此,本次項(xiàng)目就只配置 rocketmq.producer.endpoints 用于啟用默認(rèn)的生產(chǎn)者,消費(fèi)者使用Push消費(fèi)模式,所以配置rocketmq.push-consumer.endpoints。配置如下:
rocketmq:
producer:
endpoints: localhost:8081
push-consumer:
endpoints: localhost:8081topic在代碼中指定,不使用rocketmq.producer.topic和rocketmq.push-consumer.topic配置默認(rèn)的topic。
tips: 在啟動(dòng)客戶(hù)端服務(wù)時(shí),topic需要先創(chuàng)建,否則會(huì)啟動(dòng)報(bào)錯(cuò)。
生產(chǎn)者生產(chǎn)消息
生產(chǎn)消息通過(guò)SpringBoot自動(dòng)裝配的RocketMQClientTemplate對(duì)象實(shí)現(xiàn),發(fā)送Message對(duì)象,示例代碼如下:
@Service
public class MyService {
@Autowired
private RocketMQClientTemplate rocketMQClientTemplate;
public void sendMessage() {
byte[] bytes = "這是一個(gè)字符串".getBytes(StandardCharsets.UTF_8);
Message<byte[]> message = MessageBuilder.withPayload(bytes).build();
rocketMQClientTemplate.send("MyTopic", message);
}
}??注意:在 RocketMQ 5.x 中,
Message對(duì)象已從自定義對(duì)象改為spring-messaging包中的Message對(duì)象。一般通過(guò)MessageBuilder構(gòu)建,實(shí)例對(duì)象類(lèi)型為GenericMessage。
消費(fèi)者消費(fèi)消息
消費(fèi)者通過(guò)@RocketMQMessageListener注解,并實(shí)現(xiàn)RocketMQListener接口消費(fèi)消息,示例代碼如下:
@Service
@RocketMQMessageListener(consumerGroup = "MyTopic-service", topic = "MyTopic", tag = "*")
public class MyService implements RocketMQListener {
@Override
public ConsumeResult consume(MessageView messageView) {
// 從 MessageView 中獲取 ByteBuffer
ByteBuffer byteBuffer = messageView.getBody();
// 轉(zhuǎn)換 ByteBuffer 為字節(jié)數(shù)組
byte[] body = new byte[byteBuffer.remaining()];
byteBuffer.get(body);
// 處理字節(jié)數(shù)組,例如轉(zhuǎn)換為字符串
String messageBody = new String(body, StandardCharsets.UTF_8);
System.out.println("消費(fèi)消息內(nèi)容:" + messageBody);
return ConsumeResult.SUCCESS;
}
}服務(wù)端環(huán)境搭建
下載二進(jìn)制包
在 Apache RocketMQ 本地部署 RocketMQ 文檔中,可以找到最新的二進(jìn)制包,位置如下:

如果想保持跟本文相同版本,可以直接點(diǎn)擊鏈接下載RocketMQ 5.3.1版本。
啟動(dòng)NameServer
#### 啟動(dòng)namesrv $ nohup sh bin/mqnamesrv & #### 驗(yàn)證namesrv是否啟動(dòng)成功 $ tail -f ~/logs/rocketmqlogs/namesrv.log The Name Server boot success...
本地模式啟動(dòng)Broker+Proxy
#### 先啟動(dòng)broker $ nohup sh bin/mqbroker -n localhost:9876 --enable-proxy & #### 驗(yàn)證broker是否啟動(dòng)成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a $ tail -f ~/logs/rocketmqlogs/proxy.log The broker[broker-a,192.169.1.2:10911] boot success...
mqbroker腳本默認(rèn)會(huì)讀取 conf/broker.conf 配置用于Broker服務(wù)。在 conf/rmq-proxy.json 中是Proxy服務(wù)的配置,通過(guò) --enable-proxy 命令啟動(dòng)時(shí),需要加上 -pc conf/rmq-proxy.json 參數(shù)指定配置文件位置。
broker.conf的監(jiān)聽(tīng)端口key為listenPort,管理端口key為brokerAdminPort。
rmq.proxy.json的gRPC請(qǐng)求端口key為grpcServerPort,傳統(tǒng)的消息發(fā)送和接收請(qǐng)求的端口key為remotingListenPort。
- 關(guān)閉服務(wù)
- 停止Broker:
sh bin/mqshutdown broker - 停止NameServer:
sh bin/mqshutdown namesrv
- 停止Broker:
關(guān)于RocketMQ的管理命令可以參考Admin Tool。
links:
RocketMQ 5.x在SpringBoot中的上手使用過(guò)程
到此這篇關(guān)于springboot 3.x 整合 RocketMQ 5.x的詳細(xì)過(guò)程的文章就介紹到這了,更多相關(guān)springboot 3.x 整合 RocketMQ內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven如何手動(dòng)安裝依賴(lài)到本地倉(cāng)庫(kù)
這篇文章主要介紹了Maven如何手動(dòng)安裝依賴(lài)到本地倉(cāng)庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Java swing 圖像處理多種效果實(shí)現(xiàn)教程
這篇文章主要介紹了Java swing 圖像處理多種效果實(shí)現(xiàn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
詳解Mybatis 傳遞參數(shù)類(lèi)型為L(zhǎng)ist的取值問(wèn)題
這篇文章主要介紹了詳解Mybatis 傳遞參數(shù)類(lèi)型為L(zhǎng)ist的取值問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Shiro 控制并發(fā)登錄人數(shù)限制及登錄踢出的實(shí)現(xiàn)代碼
本文通過(guò)shiro實(shí)現(xiàn)一個(gè)賬號(hào)只能同時(shí)一個(gè)人使用,本文重點(diǎn)給大家分享Shiro 控制并發(fā)登錄人數(shù)限制及登錄踢出的實(shí)現(xiàn)代碼,需要的朋友參考下吧2017-09-09
使用SpringBoot + Redis + Vue實(shí)現(xiàn)動(dòng)態(tài)路由加載頁(yè)面的示例代
在現(xiàn)代 Web 應(yīng)用開(kāi)發(fā)中,動(dòng)態(tài)路由加載能夠顯著提升應(yīng)用的靈活性和安全性,本文將深入探討如何利用 Spring Boot、Redis、Element UI 和 Vue 技術(shù)棧實(shí)現(xiàn)動(dòng)態(tài)路由加載,并通過(guò) Redis 生成和驗(yàn)證有效鏈接以實(shí)現(xiàn)頁(yè)面訪問(wèn)控制,需要的朋友可以參考下2024-09-09
java實(shí)現(xiàn)幸運(yùn)抽獎(jiǎng)功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)幸運(yùn)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
maven私有鏡像倉(cāng)庫(kù)nexus部署使用
Nexus在企業(yè)開(kāi)發(fā)中還是比較常用的私有倉(cāng)庫(kù)管理工具,本文主要介紹了maven私有鏡像倉(cāng)庫(kù)nexus部署使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07

