【问题标题】:Paho Java - file persistencePaho Java - 文件持久性
【发布时间】:2017-07-30 15:19:01
【问题描述】:

我最近开始使用 java 的 paho mqtt 和 mqtt,我被 mqtt 代理和 paho 客户端提供的持久性机制所困扰。也许我误解了(可能是这样的)mqtt上下文中持久性的概念。

我们必须支持的用例如下:我们的 mqtt 客户端应该有可能已经断开了 7 天(我非常怀疑这是否会发生,但可以),甚至申请到在这 7 天内关闭而没有恢复连接,一旦它启动并运行,在它断开连接时发送所有 7 天的消息。

Paho 客户端支持在它或代理关闭时缓存消息的持久性,一旦网络恢复或代理启动,就会发送缓冲消息,但如果应用程序在客户端断开连接时关闭,则无法发送缓冲消息或经纪人不可用。

基本上我的问题是 - 断开缓冲的消息是否有可能在 paho 客户端关闭并重新启动后仍然存在?

【问题讨论】:

    标签: java mqtt paho


    【解决方案1】:

    规范没有说明,只是具体说明:

    保留消息是设置了保留标志的普通 MQTT 消息 为真。代理将存储最后保留的消息和 该主题的相应 QoS 每个订阅一个 与保留消息的主题相匹配的主题模式,将 订阅后立即收到消息。对于每个主题 一个保留的消息将由代理存储。

    如您所见,您的客户只会获得该主题的最后发布消息...

    其他一切都将永远回归!

    【讨论】:

    • 保留消息不同于排队消息和客户端中的持久性
    【解决方案2】:

    假设您使用的是 MqttDefaultFilePersistence 而不是 MemoryPersistence 模块,那么当客户端无法到达代理时,应该将消息排队,并且这些排队的消息也应该在客户端重新启动后仍然存在。

    离线缓冲是一个相对较新的功能,但它应该在所有当前版本中

    【讨论】:

    • 是的,我正在使用MqttDefaultFilePersistence。当我停止代理并重新启动它时,工作正常 - 排队的消息一旦再次启动就会发送给代理。但是当 ((客户端离线或代理关闭) & paho 客户端重新启动) 的情况下不起作用。基本上,我需要离线缓冲消息才能在客户端重新启动后继续存在,并在客户端再次连接后发送。我会再试一次仔细检查,也许我漏掉了什么。
    • 您是否将 clean session 设置为 true?它可能需要为 false 才能起作用
    • 不,当然,clean session 是错误的,但是我明天上班时会再次测试这个。会通知你结果。感谢您迄今为止的努力。
    • 我没能成功。我很可能错过了一些 mqtt 概念,或者我做错了什么。我为使其正常工作而采取的步骤是:1)客户端每 5 秒连接一次并成功发布消息,并且它们已成功发送到代理 2)停止代理并等待 30 秒左右 4)关闭应用程序 5)启动代理 6) 通过它启动应用程序和客户端,发送消息,但不发送代理关闭时产生的消息。 (我正在为有效载荷设置时间戳。)
    【解决方案3】:

    将客户端 ID 和清理会话设置为 false 将在客户端断开连接时保留代理处的所有消息。

    设置 MaxInflight 以在代理关闭时在客户端排队消息。

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 2019-11-09
      • 2014-05-11
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多