zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    无法添加数据库未能加载文件或程序集“Microsoft.SqlServer.Management.Sdk.Sfc, Version=10.0.0.0, Culture=neutral,PublicKeyToken=89845dcd8080c
    转载:自己制作Visual Studio项目模板(以原有项目为模版) VS—项目模板丢失的解决方案
    设计一个高效的缓存管理服务 C#
    Visual Studio 30个快捷键2009年05月22日
    Everything 中文绿色版
    Visual studio 打包
    远程桌面连接超出最大连接数的3种解决办法
    [Cache 学习] Cache.Insert 与 Cache.Add 区别
    三层架构之我见 —— 不同于您见过的三层架构。
    基于IIS发布你的WCF Service。
  • 原文地址:https://www.cnblogs.com/xuxiaojian/p/9052020.html
Copyright © 2011-2022 走看看