RocketMQ相關問題


RocketMQ相關問題

1、發送消息時tags參數疑惑

tags參數:在發送消息是,新建Message對象時,可以指定要發送到那個topic下。我的疑惑是:發送消息時,這個tags參數到底是指定一個還是可以指定多個。

先查看訂閱消息方法源碼:

 1 /**
 2      * Subscribe a topic to consuming subscription.
 3      *
 4      * @param topic topic to subscribe.
 5      * @param subExpression subscription expression.it only support or operation such as "tag1 || tag2 || tag3" <br>
 6      * if null or * expression,meaning subscribe all
 7      * @throws MQClientException if there is any client error.
 8      */
 9     @Override
10     public void subscribe(String topic, String subExpression) throws MQClientException {
11         this.defaultMQPushConsumerImpl.subscribe(topic, subExpression);
12     }

注意到,第二個參數是指定訂閱topic下的哪些tag,多個tag之間用||分隔。

基於以上的經驗,我們首先在生產者發送消息的時候將Message的tags參數設置為兩個,用||分隔,如TagA||TagB,意思是將一條消息發送到兩個tag下(一條消息應該只屬於一個tag,這里且先做測試):

1 /*
2                  * Create a message instance, specifying topic, tag and message body.
3                  */
4                 Message msg = new Message("TopicTest" /* Topic */,
5                     "TagA||TagB" /* Tag */,
6                     ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
7                 );

這里大家可以先注意一下這個都提到的是tag,而不是tags。

按照上面的想法,既然生產者把一條消息發到了兩個tag下面,那我們就分別訂閱TagA和TagB,收到消息后打印該消息的標簽屬性:

1 
              consumer.subscribe("TopicTest", "TagA");
       
        //consumer.subscribe("TopicTest", "TagB");
        
        //consumer.subscribe("TopicTest", "TagA||TagB");
              @Override
2             public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
3                 ConsumeConcurrentlyContext context) {
4                 System.out.println(msgs.get(0).getTags());
6                 return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
7             }

經過測試,分別訂閱TagA和TagB時都收不到消息,只有訂閱了TagA||TagB時才能收到消息,且消息標簽就是TagA||TagB

2、總結

以上說明發送消息時指定Message參數tags時,試圖用||分隔開傳遞多個tag,rocketmq並不會解析將其拆成多個tag,而是將其整體當作一個tag,也就是說,一條消息只能屬於一個tag。

!!!!!!!!!

但是我想說為什么源碼的Message類的形參列表要用tags這種復數形式呢?咋不用tag,而且

public String getTags() {//獲取消息標簽
        return this.getProperty(MessageConst.PROPERTY_TAGS);
    }

為什么這里都是tags這種復數形式。。。這很容易讓我這種多想的人覺得納悶,如果只能指定一個標簽就用tag不就行了,為毛要用tags。


免責聲明!

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



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