MQTT 客户机中的消息持久性

如果以至少一次恰好一次的服务质量发送发布消息,那么这些消息将成为持久消息。 您可以在客户机上实施自己的持久性机制,也可以使用随客户机一起提供的缺省持久性机制。 将发布发送至客户机或者从客户机发送发布时都存在持久性。

MQTT中,消息持久性有两个方面: 如何传输消息以及是否将其作为持久消息在 IBM® MessageSightIBM MQ 中排队。
  1. MQTT 客户机将消息持久性与服务质量相耦合。 根据您为消息选择的服务质量,使消息成为持久消息。 要实现必需的服务质量,必须具备消息持久性。
    • 如果指定了最多一次QoS=0),那么客户机会在发布消息后立即丢弃该消息。 如果在消息的上游处理过程中发生了任何故障,将不会再次发送此消息。 即使客户机保持活动状态,也不会再次发送此消息。 QoS=0 消息的行为与 IBM MQ 快速非持久消息相同。
    • 如果客户机采用 QoS 1 或者 QoS 2 来发布消息,那么此消息为持久消息。 消息存储在本地,仅当不再需要保证至少一次QoS=1)或恰好一次QoS=2)交付时,才会从客户机中丢弃该消息。
  2. 如果消息标记为 QoS 1 或 2 ,那么它将作为持久消息在 IBM MessageSightIBM MQ 中排队。 如果将其标记为 QoS=0,那么会将其作为非持久消息在 IBM MessageSightIBM MQ 中排队。 在 IBM MQ 非持久消息在队列管理器之间传输 正好一次,除非消息通道将 NPMSPEED 属性设置为 FAST

持久发布将存储在客户机上,直到客户机应用程序接收到此发布为止。 对于 QoS=2,当应用程序回调返回控制时,将从客户机上废弃发布。 对于 QoS=1,如果发生了故障,那么应用程序可能会再次接收到发布。 对于 QoS=0,回调接收到发布不会超过一次。 如果发生了故障,或者在发布时客户机断开连接,那么回调可能不会接收到发布。

当您预订主题时,可以降低订户用来接收消息的 QoS,使它与其持久性功能相匹配。 将使用订户请求的最高的 QoS 发送在更高的 QoS 的情况下创建的发布。

存储消息

在不同的小型设备上,数据存储器的实现的变化很大。 在 MQTT 客户机管理的存储器中临时保存持久消息的模型可能太慢,或者需要过多的存储器。 在移动设备中,移动操作系统可能提供适合 MQTT 消息的存储服务。

为了灵活地满足小型设备的约束, MQTT 客户机具有两个持久性接口。 该接口可定义存储持久消息的过程中涉及的操作。 MQTT 客户机 for Java的 API 文档中描述了这些接口。 有关 MQTT 客户机库的客户机 API 文档的链接,请参阅 MQTT 客户机编程参考 您可以实现适合设备的接口。 在 Java SE 上运行的 MQTT 客户机具有用于在文件系统中存储持久消息的接口的缺省实现。 它使用 java.io 包。

持久性类

MqttClientPersistence
MqttClientPersistence 实现的实例作为 MqttClient 构造函数的参数传递到 MQTT 客户机。 如果从 MqttClient 构造函数中省略 MqttClientPersistence 参数,那么 MQTT 客户机将使用类 MqttDefaultFilePersistenceMqttDefaultMIDPPersistence来存储持久消息。
MqttPersistable
MqttClientPersistence 使用存储关键字来获取和放置 MqttPersistable 对象。 如果您未使用 MqttDefaultFilePersistenceMqttDefaultMIDPPersistence,那么必须提供 MqttPersistable 的实现以及 MqttClientPersistence 的实现。
MqttDefaultFilePersistence

MQTT 客户机提供 MqttDefaultFilePersistence 类。 如果您将客户机应用程序中的 MqttDefaultFilePersistence 实例化,那么可以作为 MqttDefaultFilePersistence 构造函数的一个参数来提供用于存储持久消息的目录。

或者, MQTT 客户机可以实例化 MqttDefaultFilePersistence 并将文件放在以下缺省目录中:

client identifier -tcp hostname portnumber

将从目录名称字符串中移除以下字符:

\, \\, /, :

目录的路径是系统属性 rcp.data 的值;如果未设置 rcp.data,那么路径是系统属性 usr.data 的值,其中
  • rcp.data 是与安装 OSGi 或 Eclipse 富客户机平台 (RCP) 相关联的属性。
  • usr.data 是用于启动应用程序的 Java 命令的启动目录。