ActiveMQ 中是不是支持 MQTT 队列?

Posted

技术标签:

【中文标题】ActiveMQ 中是不是支持 MQTT 队列?【英文标题】: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。

【问题讨论】:

【参考方案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

保罗。

【讨论】:

以上是关于ActiveMQ 中是不是支持 MQTT 队列?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot的JMS发送和接收队列消息,基于ActiveMQ

activemq 5.10.0 支持的最大 mqtt 连接数是多少

如何通过javascript 使用 MQTT

架构设计:系统间通信(19)——MQ:消息协议(上)

Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍编译和使用

如何从 MQTT 生产并在 ActiveMQ 中作为 MQTT 和 JMS 消费