我是新手并了解这个协议。在阅读关于MQTT的wiki时。第一行“MQTT [1]是基于发布 - 订阅的”轻量级“消息传递协议,用于TCP / IP协议之上。”
这是否意味着MQTT仅支持Topic而不支持或使用队列?
因为,即使我查看了可用的客户端API(fusesource和paho)。我找到了Queue的客户端API。
答案 0 :(得分:2)
是的,MQTT仅是主题,没有队列支持
答案 1 :(得分:2)
ActiveMQ支持MQTT,你可以在这里阅读:
http://activemq.apache.org/mqtt.html
在最近几周,MQ遥测传输中更改了Message Queue遥测传输的首字母缩写,因为MQTT没有队列概念! : - )
正如@hardillb所说,发布和订阅操作是在主题上执行的。
“队列”的概念仅在您使用高级“干净会话”到虚假功能时实现,这些功能意味着代理保存在客户端脱机的主题上发布的消息,以便当客户端返回在线时,将收到消息。 但是,此实现与代理严格相关(队列不需要)。
我写了以下免费电子书(专注于微软技术),但第3章专门讨论MQTT协议本身。
http://www.embedded101.com/DevelopM2MIoTDevicesEbook.aspx
保罗。
答案 2 :(得分:1)
如果要使用ActiveMQ实现Queue,MQTT不支持队列使用STOMP协议检查此链接 https://github.com/asantos2000/RabbitMQGozirraStompAndroid
如果您想使用主题,只需使用 QUEUE_NAME = / topic / nameof_topic ,如果您想使用队列已使用目的地 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 :(得分:0)
根据JMS或许多其他消息传递系统,MQTT不了解队列。 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>