Springboot詳細(xì)講解RocketMQ實(shí)現(xiàn)順序消息的發(fā)送與消費(fèi)流程
如何實(shí)現(xiàn)順序消息? 需要程序保證發(fā)送和消費(fèi)的是同一個(gè) Queue
rocketmq默認(rèn)發(fā)送的消息是進(jìn)入多個(gè)消息隊(duì)列,然后消費(fèi)端多線程并發(fā)消費(fèi),所以默認(rèn)情況,不是順序消費(fèi)消息的;有時(shí)候,我們需要順序消費(fèi)一批消息,比如電商系統(tǒng) 訂單創(chuàng)建、支付、完成操作,需要順序執(zhí)行;
RocketMQTemplate給我們提供了SendOrderly方法(有多個(gè)重載),來實(shí)現(xiàn)發(fā)送順序消息;包括以下:
syncSendOrderly,發(fā)送同步順序消息;
asyncSendOrderly,發(fā)送異步順序消息;
sendOneWayOrderly,發(fā)送單向順序消息;
一般我們用syncSendOrderly方法發(fā)送同步順序消息。
參數(shù)一:topic 如果想添加tag,可以使用"topic:tag"的寫法
參數(shù)二:消息內(nèi)容
參數(shù)三:hashKey 使用此參數(shù)選擇隊(duì)列。 例如:orderId,productId…
因?yàn)閎roker會(huì)管理多個(gè)消息隊(duì)列,這個(gè)hashKey參數(shù),主要用來計(jì)算選擇隊(duì)列的,一般可以把訂單ID,產(chǎn)品ID作為參數(shù)值;發(fā)送到一個(gè)隊(duì)列,這樣方便搞順序隊(duì)列;以及消費(fèi)端接收的時(shí)候,默認(rèn)是并發(fā)多線程去接收消息。
RocketMQMessageListener有個(gè)屬性consumeMode
,默認(rèn)是ConsumeMode.CONCURRENTLY ,我們要改成ConsumeMode.ORDERLY,單線程順序接收消息;
下面來介紹下 springboot+rockermq 整合實(shí)現(xiàn) 順序消息的發(fā)送與消費(fèi)
一、創(chuàng)建Springboot項(xiàng)目添加rockermq依賴
<!--rocketMq依賴--> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>2.2.1</version> </dependency>
二、配置rocketmq
# 端口
server:
port: 8083# 配置 rocketmq
rocketmq:
name-server: 127.0.0.1:9876
#生產(chǎn)者
producer:
#生產(chǎn)者組名,規(guī)定在一個(gè)應(yīng)用里面必須唯一
group: group1
#消息發(fā)送的超時(shí)時(shí)間 默認(rèn)3000ms
send-message-timeout: 3000
#消息達(dá)到4096字節(jié)的時(shí)候,消息就會(huì)被壓縮。默認(rèn) 4096
compress-message-body-threshold: 4096
#最大的消息限制,默認(rèn)為128K
max-message-size: 4194304
#同步消息發(fā)送失敗重試次數(shù)
retry-times-when-send-failed: 3
#在內(nèi)部發(fā)送失敗時(shí)是否重試其他代理,這個(gè)參數(shù)在有多個(gè)broker時(shí)才生效
retry-next-server: true
#異步消息發(fā)送失敗重試的次數(shù)
retry-times-when-send-async-failed: 3
三、新建一個(gè)controller來做消息發(fā)送
package com.example.springbootrocketdemo.controller; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 模擬兩個(gè)訂單發(fā)送消息 * * 順序信息的三種方式:同步、異步、單向 * syncSendOrderly,發(fā)送同步順序消息; * asyncSendOrderly,發(fā)送異步順序消息; * sendOneWayOrderly,發(fā)送單向順序消息; * 一般我們用第一種發(fā)送同步順序消息; * @author qzz */ @RestController public class RocketMQOrderCOntroller { @Autowired private RocketMQTemplate rocketMQTemplate; /** * 發(fā)送同步順序消息 */ @RequestMapping("/testSyncOrderSend") public void testSyncSend(){ //參數(shù)一:topic 如果想添加tag,可以使用"topic:tag"的寫法 //參數(shù)二:消息內(nèi)容 //參數(shù)三:hashKey 用來計(jì)算決定消息發(fā)送到哪個(gè)消息隊(duì)列, 一般是訂單ID,產(chǎn)品ID等 rocketMQTemplate.syncSendOrderly("test-topic-orderly","111111創(chuàng)建","111111"); rocketMQTemplate.syncSendOrderly("test-topic-orderly","111111支付","111111"); rocketMQTemplate.syncSendOrderly("test-topic-orderly","111111完成","111111"); rocketMQTemplate.syncSendOrderly("test-topic-orderly","222222創(chuàng)建","222222"); rocketMQTemplate.syncSendOrderly("test-topic-orderly","222222支付","222222"); rocketMQTemplate.syncSendOrderly("test-topic-orderly","222222完成","222222"); } }
四、創(chuàng)建消費(fèi)端監(jiān)聽消息消費(fèi)消息
package com.example.springbootrocketdemo.config; import org.apache.rocketmq.spring.annotation.ConsumeMode; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; import org.springframework.stereotype.Service; /** * 消費(fèi)順序消息 * 配置RocketMQ監(jiān)聽 * * ConsumeMode.ORDERLY:順序消費(fèi) * @author qzz */ @Service @RocketMQMessageListener(consumerGroup = "test",topic = "test-topic-orderly",consumeMode = ConsumeMode.ORDERLY) public class RocketMQCommonConsumerListener implements RocketMQListener<String> { @Override public void onMessage(String s) { System.out.println("consumer 順序消費(fèi),收到消息:"+s); } }
五、啟動(dòng)服務(wù)測試順序消息發(fā)送與消費(fèi)
測試成功!
到此這篇關(guān)于Springboot詳細(xì)講解RocketMQ實(shí)現(xiàn)順序消息的發(fā)送與消費(fèi)流程的文章就介紹到這了,更多相關(guān)Springboot順序消息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)一個(gè)簡易聊天室流程
這篇文章主要介紹了我的java課程設(shè)計(jì)一個(gè)多人聊天室(socket+多線程)本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11Java編程Webservice指定超時(shí)時(shí)間代碼詳解
這篇文章主要介紹了Java編程Webservice指定超時(shí)時(shí)間代碼詳解,簡單介紹了webservice,然后分享了通過使用JDK對(duì)Webservice的支持進(jìn)行Webservice調(diào)用實(shí)現(xiàn)指定超時(shí)時(shí)間完整示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-11-11Java中對(duì)AtomicInteger和int值在多線程下遞增操作的測試
這篇文章主要介紹了Java中對(duì)AtomicInteger和int值在多線程下遞增操作的測試,本文得出AtomicInteger操作 與 int操作的效率大致相差在50-80倍上下的結(jié)論,需要的朋友可以參考下2014-09-09MyBatis學(xué)習(xí)教程(五)-實(shí)現(xiàn)關(guān)聯(lián)表查詢方法詳解
本文給大家介紹mybatis關(guān)聯(lián)查詢,包括一對(duì)一關(guān)聯(lián)查詢,一對(duì)多關(guān)聯(lián)查詢,代碼簡單易懂,感興趣的朋友一起學(xué)習(xí)吧2016-05-05