最近做的專案的一個版本需求中,需要用到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的坑,由於開發經驗有限,技術粗糙,上文的描述可能不是太清晰,可能會出現誤點或者錯誤的地方,望大家給予建議,我加以改進,共同進步!
覺得此文不錯的,點贊轉發,本人非常感謝!