【问题标题】:Is MQTT support queue in ActiveMQ?ActiveMQ 中是否支持 MQTT 队列?
【发布时间】:2014-08-24 06:03:53
【问题描述】:

我是新手,正在学习这个协议。在阅读有关 MQTT 的 wiki 时。第一行“MQTT[1] 是基于发布-订阅的“轻量级”消息传递协议,用于 TCP/IP 协议之上。”

这是否意味着 MQTT 只支持 Topic 而不支持或使用队列?

因为,即使我使用可用的客户端 API(fusesource 和 paho)进行检查。我找到了 Queue 的客户端 API。

【问题讨论】:

    标签: java activemq mqtt paho


    【解决方案1】:

    MQTT 不了解 JMS 或许多其他消息传递系统中的队列。 MQTT 只理解可以发布和订阅的主题。

    我使用 ActiveMQ 5.13.1 作为 MQTT 代理的解决方案是包含一个复合主题,MQTT 客户端将发送到该主题。 ActiveMQ 将根据您的配置提取写入主题的消息并将它们写入一个队列(或多个队列或主题)。请记住,主题名称的句点将更改为正斜杠,例如,给定示例中的主题名称LOCAL.EC.T 将变为LOCAL/EC/T。至少对于我使用 Eclipse Paho Client MQTTv3 1.0.2 的测试设置来说是这样,我相信这是一个 MQTT 实现细节。

    ${ACTIVEMQ_HOME}/conf/activemq.xml 配置。

    <beans>
        <broker>
            ...
            <destinationInterceptors>
                <virtualDestinationInterceptor>
                    <virtualDestinations>
                        <compositeTopic name="LOCAL.EC.T">
                            <forwardTo>
                                <queue physicalName="LOCAL.EC.Q.1" />
                                <queue physicalName="LOCAL.EC.Q.2" />                       
                            </forwardTo>
                        </compositeTopic>
                    </virtualDestinations>
                </virtualDestinationInterceptor>
            </destinationInterceptors>
            ...
        </broker>
    </beans>
    

    This is the reference I used.

    【讨论】:

    • 如果你用 forwardTo 'topic' 而不是 'queue' 将它从 'compositeTopic' 换成 'compositeQueue' 的话,这条评论会更有用...这实际上可以解决映射ActiveMQ 队列到 MQTT 主题。
    • 从未指定方向。给出的示例将 MQTT 主题映射到 ActiveMQ 队列。如果你需要相反的,然后适当地配置。我不再有这个设置,所以我无法验证它可能是什么,或者我的示例是否是单向的(我认为是)。
    【解决方案2】:

    MQTT 不支持队列如果你想用 ActiveMQ 实现队列使用 STOMP 协议检查这个链接 https://github.com/asantos2000/RabbitMQGozirraStompAndroid

    如果你想使用 Topic 只需使用 QUEUE_NAME= /topic/nameof_topic 并且如果你想使用 Queue 使用的目的地 QUEUE_NAME=/queue/nameof_queue

    为过滤队列中的消息添加选择器

     Map<String,String> header=new HashMap<String, String>();
     header.put("selector","(title = 'selector_name')");
    con.subscribe(QUEUE_NAME, new Listener() {
                    @Override
                    public void message(Map header, String body ) {
                        Log.d(TAG,"onMessage()");
                        Log.d(TAG,"message is " + body);
                        Log.d(TAG,"header is " + header.toString());
                        message = "\n("+ counterReceive +")<-- " + body;
                        myHandler.post(myRunnable);
                        counterReceive++;
                    }
                },header);
    

    您只会收到那些标题包含您的选择器名称

    的消息

    【讨论】:

      【解决方案3】:

      是的,MQTT 只是主题,不支持队列

      【讨论】:

        【解决方案4】:

        ActiveMQ 支持 MQTT,您可以在这里阅读更多内容:

        http://activemq.apache.org/mqtt.html

        最近几周,MQ Telemetry Transport 中 Message Queue Telemetry Transport 的首字母缩写词发生了变化,因为 MQTT 没有队列概念! :-)

        正如@hardillb 所说,发布和订阅操作是在主题上执行的。

        “队列”的概念仅在您使用高级“干净会话”来实现虚假功能时,这意味着代理保存在客户端离线的主题上发布的消息,以便当客户端返回在线时,它将收到消息。 但是,此实现与代理严格相关(与队列无关)。

        我编写了以下免费电子书(侧重于 Microsoft 技术),但第 3 章专门介绍 MQTT 协议本身。

        http://www.embedded101.com/DevelopM2MIoTDevicesEbook.aspx

        保罗。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-26
          • 1970-01-01
          • 2015-03-09
          • 1970-01-01
          • 1970-01-01
          • 2012-01-09
          • 2011-10-04
          • 1970-01-01
          相关资源
          最近更新 更多