RocketMQ同一個消費者唯一Topic多個tag踩坑經歷


最近做的項目的一個版本需求中,需要用到MQ,對數據記錄進行異步落庫,這樣可以減輕數據庫的壓力,同時可以抗住大量的數據落庫。這里需要說明一下本人用到的MQ是公司自己在阿里的RokectMQ的基礎上進行封裝的,然后加上自己的東西,形成個性化的開發,且安全性高。這里就不多透露相關公司的信息啦,我就叫它MQ。

       由於剛剛從事JAVA開發這個行業不久,所以在使用到這個MQ的時候本人還是比較陌生的,於是花了一些時間去學習,當然學習的時候能記住的東西還是不多的,因為在學習理論的時候,沒有真正的去實踐,效果不是很明顯,就這樣學的也是雲里霧里。對公司的MQ有了最基本的了解之后,就開始動手擼代碼了,在這個需求中引入了公司的MQ依賴jar包,然后在開發環境中配置好相關的MQ信息,寫了一個消費MQ的類,當然發消息的代碼還是很好寫的。

MQ生產者的核心代碼:

@Autowired
 
private MqsTemplate mqsTemplate ;
 
public void sendMqs(String key, ContentDto dto){
 
String content = JSON.toJSONString(dto);
 
mqsTemplate.sendMessage(content, topic, tag, key);
 
}

MQ消費者的核心代碼:

BaseConsumer.java
 
public abstract class BaseConsumer implements MqsListener<String>{
 
@Autowired
 
private TestMapperOne testMapperOne;
 
@Autowired
 
private TestMapperTwo testMapperTwo;
 
@Override
 
public void onMessage(String topic, String tag, String key, String message){
 
log.info("topic {} tag {} key {}", topic, tag, key);
 
try{
 
this.consumer(key, message, tag);
 
}catch(Exception e){
 
log.error(String.format("topic %s tag %s key %s message %s), topic, tag, key, message), e);
}
}
protected abstract void consumer(String key, String message, String tag);
}
TestConsumer.java
@Service
@MqsMessageListener(consumerId = "${自己去MQ的頁面去新增就行}"//最開始的寫法(錯誤的寫法)
topicTags = ("${haha.mq.topic:TEST_HAHA}:${haha.mq.topic:TEST_TAG01};" +
"${haha.mq.topic:TEST_HAHA}:${haha.mq.topic:TEST_TAG02}")
//在這里對於同一個topic,使用“ ; ”分割是不當的,分號分割是指多個topicTags的topic是不同的,如果這里這樣分割的話,
消息發送到MQ去,可以發現消息確實是發送到了MQ,但是沒有被消費者消費,這也就是我遇到的坑了,由於開年剛來上班,公司的眾
位大佬還沒來上班,能問的人又很少,於是自己琢磨了一上午。
最終發現,原來是由於我在同一個項目的同一個類上的唯一topic對應了不同的tag,在MQ的頁面可以清晰的看到,后面的tag覆蓋了前面的tag,
顯然這樣是不合理的。 經過查閱資料發現,同一個類上的唯一topic對應不同的tag寫法如下 正確寫法: topicTags
= ("${haha.mq.topic:TEST_HAHA}:${haha.mq.topic:TEST_TAG01}||" + "${haha.mq.topic:TEST_TAG02}") ) 在同一個類中(也就是一個消費者中),同一個topic對應不同的tag,應該使用 “ || ”進行分割,使用""或“*”訂閱所有tag。 public class TestConsumer extends BaseConsumer { //此處代碼就不寫了,主要就是根據不同的tag,然后把對應的數據請求持久層的接口,進行落庫,當然這里我是為了省事,才踩到這樣的坑,
其實針對不同的情況,就算是使用同一個topic訂閱,分成兩個類去寫就ok了,在MQ中再新增一個消費者,這樣在同一個項目的不同消費者類中,
一個topic對應一個tag。就算它們兩個的topic是一樣的都是沒關系的,而且這樣別人看起你的代碼來,也是非常直觀的,層次分明。
}

PS:這里補充一下

@MqsMessageListener 是消費者監聽注解,用於發現消費者,以及屬性包括消費所有單一功能的注解,作用在類上面。

以上就是踩到的RocketMQ的坑,由於開發經驗有限,技術粗糙,上文的描述可能不是太清晰,可能會出現誤點或者錯誤的地方,望大家給予建議,我加以改進,共同進步!

覺得此文不錯的,點贊轉發,本人非常感謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM