【问题标题】:How does persistence session work in MQTT?持久会话在 MQTT 中如何工作?
【发布时间】:2019-10-31 19:36:57
【问题描述】:

我使用 MQTT 和 QOS 1。

我有一个消费者和一个生产者。它们相互通信(HiveMQ 作为客户端)。他们使用 VerneMQ 作为代理。我使用持久会话。

如果消费者离线,后来又上线,他应该成为他离线的所有消息。但这只有在消费者在另一台计算机上并且我没有停止微服务但我关闭 WiFi 然后再打开时才有效。但是,如果我关闭了一个微服务,然后重新启动它,它就不适用于离线消息。

如果我再次启动微服务,我认为这就是它再次订阅该主题的原因。是这个原因吗?或不?

更新: 我只是在消费者第二次开始时没有订阅就测试了它。那也行不通。 所以订阅并不是消费者收不到消息的原因。

【问题讨论】:

  • QOS 1,它不适用于 QOS 0。
  • 它不应该在 QOS 0 下工作
  • 当然,但我使用 QoS 1。
  • 这不是你在最后评论中所说的,这意味着它适用于 QOS1 但不适用于 QOS0。而且你在哪里使用什么QOS? *.com/questions/58639252/…
  • 我对两者都使用 QOS 1:消费者到代理 - 连接,以及生产者到代理 - 连接。如果我不停止微服务,但我关闭 WiFi,然后再打开它,这会起作用。但是如果我停止一个微服务然后重新启动它,那是行不通的。通过启动它必须重新连接。也许这就是原因。

标签: mqtt broker hivemq mom mqtt-vernemq


【解决方案1】:

对于持久化会话,让你在离线时成为所有消息,你需要满足一些条件:

1) 在连接时关闭 CleanStart:

Mqtt5Connect.builder()
            .cleanStart(false)
            .noSessionExpiry()
            .build()

2) 收集与发布

连接的剩余消息
  mqttClient.publishes(MqttGlobalPublishFilter.REMAINING) {
        mqtt5Publish -> handleMessage(mqtt5Publish.topic.toString(), mqtt5Publish.payload.decodeContent())
    }

3) QOS 1+

这就像一块瑞士手表。

【讨论】:

  • 使用 1.2.0 版的 HiveMQ MQTT 客户端,您可以在连接客户端之前设置您的订阅,这消除了消耗剩余发布的必要性(您是对的,这是在 1.2.0 版之前需要的) .
最近更新 更多