java - 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);
使用保留标志,我希望一旦我订阅,我的回调就会被调用。不幸的是,如果在订阅执行之前发送了消息,则不会调用订阅回调。 我如何获得保留值?
解决方案
我认为您使用的是 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来解决您的问题。
推荐阅读
- spring-boot - 如何使用 swagger OpenAPI 注释将描述设置为字段
- java - 如何在 Java 中声明任何类类型的变量或对象
- javascript - 如何将时间设置为始终:00:00:00?
- python-3.x - 是否可以将句子拆分为字符串列表并将同一行中的字符串列表大写?
- flutter - 为 Flutter 开发人员制作 UI 的最快方法?
- javascript - nodejs url.resolve 函数有什么替代品吗?
- javascript - 将 JS 翻译成数学(定义了多个变量)
- javascript - Discord.js 什么都不做
- pandas - 对 DataFrame 中的条目进行分组和计数
- unix - 如果 Unix 进程关闭,它会自行启动