传递令牌

当客户机在主题上发布时,将创建新的传递令牌。 使用传递令牌来监控发布的传递,或者阻止客户机应用程序,直到完成传递为止。

令牌是一个 MqttDeliveryToken 对象。 它是通过调用 MqttTopic.publish () 方法创建的,并且由 MQTT 客户机保留,直到客户机会话断开连接并完成传递为止。

令牌的常规用法是检查是否已完成传递。 通过使用所返回的令牌来调用 token.waitForCompletion,从而阻塞客户机应用程序直到已完成传递为止。 或者,提供 MqttCallBack 处理程序。 当 MQTT 客户机在交付发布的过程中接收到它期望的所有应答时,它将调用 MqttCallBack.deliveryComplete 以参数的形式传递传递令牌。

在完成传递之前,可以通过调用 token.getMessage 从而使用所返回的传递令牌来检查发布。

已完成传递

完成传递的过程为异步,取决于与发布关联的服务质量。
至多一次
  • QoS=0
  • MqttTopic.publish 返回时,立即完成传递。 会立即调用 MqttCallback.deliveryComplete
至少一次
  • QoS=1
  • 从队列管理器接收到有关发布的确认信息时就完成了传递。 接收到确认信息时就会调用 MqttCallback.deliveryComplete。 如果通信速度很慢或者不可靠,那么在调用 MqttCallback.deliveryComplete 之前可能会多次传递消息。
刚好一次
  • QoS=2
  • 当客户机接收到有关已完成将发布消息发布至订户的消息时就完成了传递。 一旦接收到发布消息,就会调用 MqttCallback.deliveryComplete。 它并不会等待完成消息。

在极少数情况下,客户机应用程序可能不会正常从 MqttCallback.deliveryComplete 返回到 MQTT 客户机。 但是,您知道已完成传递,因为已经调用了 MqttCallback.deliveryComplete。 如果客户机重新启动同一会话,那么不会再次调用 MqttCallback.deliveryComplete

未完成的传递

如果在客户机会话断开连接之后未完成传递,那么您可以再次连接客户机并完成传递。 仅当通过 MqttConnectionOptions 属性设置为 false 的会话发布了消息时,才能完成传递此消息。

使用同一客户机标识和服务器地址来创建客户机,然后在将 cleanSession MqttConnectionOptions 属性设置为 false 的情况下再次连接。 如果您将 cleanSession 设置为 true,那么会抛弃暂挂的传递令牌。

可以通过调用 MqttClient.getPendingDeliveryTokens 来检查是否有任何暂挂的传递。 在连接客户机之前,可以调用 MqttClient.getPendingDeliveryTokens