最近作的項目的一個版本需求中,須要用到MQ,對數據記錄進行異步落庫,這樣能夠減輕數據庫的壓力,同時能夠抗住大量的數據落庫。這裏須要說明一下本人用到的MQ是公司本身在阿里的RokectMQ的基礎上進行封裝的,而後加上本身的東西,造成個性化的開發,且安全性高。這裏就很少透露相關公司的信息啦,我就叫它MQ。java
因爲剛剛從事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消費者的核心代碼:app
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 是消費者監聽註解,用於發現消費者,以及屬性包括消費全部單一功能的註解,做用在類上面。ide
以上就是踩到的RocketMQ的坑,因爲開發經驗有限,技術粗糙,上文的描述可能不是太清晰,可能會出現誤點或者錯誤的地方,望你們給予建議,我加以改進,共同進步!學習
以爲此文不錯的,點贊轉發,本人很是感謝!this