MQMT是否支持ActiveMQ中的队列?

时间:2014-07-03 08:02:19

标签: java activemq mqtt paho

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

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

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

4 个答案:

答案 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>

This is the reference I used.