出版物
出版物是与主题字符串关联的 MqttMessage 实例。 MQTT 客户机可以创建要发送到 IBM® MQ的发布,并预订 IBM MQ 上的主题以接收发布。
MqttMessage 将字节数组作为其有效内容。 其目的在于使消息尽可能小。 MQTT protocol 允许的最大消息长度为 250 MB。
通常, MQTT 客户机程序使用 java.lang.String 或 java.lang.StringBuffer 来处理消息内容。 为了方便起见,MqttMessage 类使用 toString 方法将其有效内容转换为字符串。 要从 java.lang.String 或 java.lang.StringBuffer 来创建字节数组有效内容,可使用 getBytes 方法。
getBytes 方法将字符串转换为平台的缺省字符集。 缺省字符集通常为 UTF-8。 仅包含文本的 MQTT 出版物通常以 UTF-8编码。 使用 getBytes("UTF8") 方法来覆盖缺省字符集。
在 IBM MQ中, MQTT 发布将作为 jms-bytes 消息接收。 该消息包含 MQRFH2 文件夹,其中包含 <mqtt> 和 <mqps> 文件夹。 <mqtt> 文件夹中包含 clientId、msgId 和 qos,但是将来可能会更改此内容。
MqttMessage 还有另外三个属性:服务质量、是否保留了此消息以及此消息是否重复。 仅当服务质量为“至少一次”或者“刚好一次”时才设置重复标志。 如果先前已发送该消息,但 MQTT 客户机未足够快地确认该消息,那么将再次发送该消息,并将重复属性设置为 true。
发布
要在 MQTT 客户机应用程序中创建发布,请创建 MqttMessage。 设置其有效内容、服务质量以及是否保留,并调用 MqttTopic.publish(MqttMessage message) 方法;将返回 MqttDeliveryToken 且完成发布的过程为异步。
或者, MQTT 客户机可以在创建发布时从 MqttTopic.publish(byte [] payload, int qos, boolean retained) 方法上的参数为您创建临时消息对象。
如果出版物具有 "至少一次" 或 "正好一次" 服务质量 QoS=1 或 QoS=2,那么 MQTT 客户机将调用 MqttClientPersistence 接口。 在将传递令牌返回给应用程序之前,它将调用 MqttClientPersistence 以存储消息。
应用程序可以选择使用 MqttDeliveryToken.waitForCompletion 方法来一直阻塞到将消息传递至服务器为止。 或者,应用程序可以继续运行而不进行阻塞。 如果要检查是否已交付发布而未阻止,请向 MQTT 客户机注册实现 MqttCallback 的回调类的实例。 MQTT 客户机在交付发布后立即调用 MqttCallback.deliveryComplete 方法。 根据服务质量不同,对于 QoS=0,几乎可以立即进行传递;而对于 QoS=2,可能要花一些时间。
使用 MqttDeliveryToken.isComplete 方法来轮询是否完成了传递。 当 MqttDeliveryToken.isComplete 的值为 false 时,可以调用 MqttDeliveryToken.getMessage 以获取消息内容。 如果调用 MqttDeliveryToken.isComplete 获得的结果为 true,说明已废弃此消息,调用 MqttDeliveryToken.getMessage 将抛出空指针异常。 MqttDeliveryToken.getMessage 与 MqttDeliveryToken.isComplete 之间没有内置同步。
如果客户机在接收所有暂挂的传递令牌之前断开连接,那么客户机的新实例在连接之前可以查询暂挂的传递令牌。 在客户机连接之前,没有完成新的传递,并且调用 MqttDeliveryToken.getMessage 很安全。 使用 MqttDeliveryToken.getMessage 方法来弄清楚尚未传递哪些发布。 如果您在 MqttConnectOptions.cleanSession 设置为缺省值 true 的情况下进行连接,那么会废弃暂挂的传递令牌。
预订
队列管理器负责创建要发送到 MQTT 订户的发布。 队列管理器检查由 MQTT 客户机创建的预订中的主题过滤器是否与发布内容中的主题字符串匹配。 匹配可以是精确匹配,也可以包括通配符。 在由队列管理器将发布转发至订户之前,队列管理器将检查与此发布相关联的主题属性。 它遵循 使用包含通配符的主题字符串进行预订 中描述的搜索过程,以确定管理主题对象是否授予用户预订权限。
当 MQTT 客户机接收到服务质量为 "至少一次" 的发布时,它将调用 MqttCallback.messageArrived 方法来处理该发布。 如果出版物的服务质量为 "正好一次" QoS=2,那么 MQTT 客户机将在接收到消息时调用 MqttClientPersistence 接口以存储消息。 然后,它将调用 MqttCallback.messageArrived。