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 连接数是多少