首页 > 解决方案 > Mqtt 客户端:订阅后获取保留消息

问题描述

我正在使用最新的 Paho 版本Maven

<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.2.2</version>
</dependency>

我使用创建客户端

MqttClient client = new MqttClient("tcp://localhost", MqttClient.generateClientId());
MqttConnectOptions options = new MqttConnectOptions();
options.setMaxInflight(1000);
options.setAutomaticReconnect(true);

然后我订阅一个主题如下:

    client.setCallback(new Callback());
    client.connect();
    client.subscribe(topic);

另一个 mqtt 客户端发布关于该主题的消息

MqttMessage message = new MqttMessage(byteStream);
message.setRetained(true);

使用保留标志,我希望一旦我订阅,我的回调就会被调用。不幸的是,如果在订阅执行之前发送了消息,则不会调用订阅回调。 我如何获得保留值?

标签: javamqttpaho

解决方案


我认为您使用的是 QOS=0。QOS=0 和retained_flag=true 时保留的消息可能未保存。

更多细节:

参考链接:

SECTION (3.3.1.3 RETAIN):
如果 RETAIN 标志设置为 1,则在客户端发送给服务器的 PUBLISH 数据包中,服务器必须存储应用消息及其 QoS,以便可以将其传递给未来的订阅者订阅匹配其主题名称 [MQTT-3.3.1-5]。建立新订阅时,必须将每个匹配主题名称上的最后保留消息(如果有)发送给订阅者 [MQTT-3.3.1-6]。

如果服务器接收到 RETAIN 标志设置为 1 的 QoS 0 消息,它必须丢弃之前为该主题保留的任何消息。它应该将新的 QoS 0 消息存储为该主题的新保留消息,但可以选择随时丢弃它 - 如果发生这种情况,该主题将没有保留消息 [MQTT-3.3.1-7]。有关存储状态的更多信息,请参阅第 4.1 节。

摘要:
您可以使用QOS>0来解决您的问题。


推荐阅读