持久性会话在 MQTT 中如何工作?
How does persistence session work in MQTT?
我使用带有 QOS 1 的 MQTT。
我有一个消费者和一个生产者。它们相互通信(HiveMQ 作为 客户端)。他们使用 VerneMQ 作为 broker。我使用持久性会话。
如果一个消费者离线了,他后来又上线了,他应该成为他离线时的所有消息。但这只有在消费者在另一台计算机上并且我不停止微服务但我关闭 WiFi 然后再打开它时才有效。但是,如果我关闭一个微服务然后再次启动它,它就不能处理离线消息。
我认为这就是为什么它会再次订阅该主题,如果我再次启动微服务。是这个原因吗?或不?
更新:
我刚刚在消费者第二次启动时没有订阅就测试了它。那也不管用。
所以订阅不是消费者收不到消息的原因。
持久化session,让你在离线时变成所有消息,需要满足一些条件:
1) 在连接时关闭 CleanStart:
Mqtt5Connect.builder()
.cleanStart(false)
.noSessionExpiry()
.build()
2) 在与 publishes
连接时收集剩余消息
mqttClient.publishes(MqttGlobalPublishFilter.REMAINING) {
mqtt5Publish -> handleMessage(mqtt5Publish.topic.toString(), mqtt5Publish.payload.decodeContent())
}
3) 服务质量 1+
这就像一块瑞士手表。
我使用带有 QOS 1 的 MQTT。
我有一个消费者和一个生产者。它们相互通信(HiveMQ 作为 客户端)。他们使用 VerneMQ 作为 broker。我使用持久性会话。
如果一个消费者离线了,他后来又上线了,他应该成为他离线时的所有消息。但这只有在消费者在另一台计算机上并且我不停止微服务但我关闭 WiFi 然后再打开它时才有效。但是,如果我关闭一个微服务然后再次启动它,它就不能处理离线消息。
我认为这就是为什么它会再次订阅该主题,如果我再次启动微服务。是这个原因吗?或不?
更新: 我刚刚在消费者第二次启动时没有订阅就测试了它。那也不管用。 所以订阅不是消费者收不到消息的原因。
持久化session,让你在离线时变成所有消息,需要满足一些条件:
1) 在连接时关闭 CleanStart:
Mqtt5Connect.builder()
.cleanStart(false)
.noSessionExpiry()
.build()
2) 在与 publishes
连接时收集剩余消息 mqttClient.publishes(MqttGlobalPublishFilter.REMAINING) {
mqtt5Publish -> handleMessage(mqtt5Publish.topic.toString(), mqtt5Publish.payload.decodeContent())
}
3) 服务质量 1+
这就像一块瑞士手表。