清除会话

MQTT 客户机和遥测 (MQXR) 服务都将维护会话状态信息。 状态信息用来确保进行“至少一次”和“刚好一次”传递,以及“刚好一次”接收发布。 会话状态还包括由 MQTT 客户机创建的预订。 运行 MQTT 客户机时,您可以选择维护会话之间的状态信息,也可以选择不维护。 通过在连接之前设置 MqttConnectOptions.cleanSession 来更改清除会话方式。

当您使用 MqttClient.connect 方法来连接 MQTT 客户机应用程序时,客户机使用客户机标识和服务器地址来标识连接。 服务器将检查是否保存了先前与服务器建立连接时使用的会话信息。 如果先前的会话仍然存在,并且 cleanSession=true,那么将清除客户机和服务器中先前的会话信息。 如果 cleanSession=false,那么先前的会话将继续。 如果不存在先前的会话,那么将启动新的会话。
注: WebSphere MQ 管理员可以强制关闭打开的会话并删除所有会话信息。 如果客户机重新打开会话并且 cleanSession=false,那么将启动新的会话。

出版物

如果您使用缺省 MqttConnectOptions,或者在连接客户机之前将 MqttConnectOptions.cleanSession 设置为 true,那么在客户机建立连接时,将除去为客户机传递的所有暂挂的发布。

“清除会话”设置对于使用 QoS=0 发送的发布不起作用。 对于 QoS=1QoS=2,使用 cleanSession=true 可能会导致丢失发布。

预订

如果您使用缺省 MqttConnectOptions,或者在连接客户机之前将 MqttConnectOptions.cleanSession 设置为 true,那么在客户机建立连接时,将移除客户机的所有旧预订。 当客户机断开连接时,将移除客户机在会话期间创建的所有新预订。

如果您在连接之前将 MqttConnectOptions.cleanSession 设置为 false,那么客户机创建的任何预订都会被添加至客户机在连接之前就已存在的所有预订。 当客户机断开连接时,所有预订仍保持活动状态。

要了解 cleanSession 属性影响预订的方式,另一种方法就是将它视作模态属性。 在其缺省方式 cleanSession=true 下,客户机仅在会话的作用域内创建预订和接收发布。 在另一种方式 cleanSession=false 下,预订是持久预订。 客户机可以连接和断开连接,而其预订保持活动状态。 当客户机重新连接时,它将接收任何未传递的发布。 在它连接之后,它可以自己修改处于活动状态的预订集。

在连接之前,您必须设置 cleanSession 方式;在整个会话期间都将保持此方式。 要更改此属性的设置,必须将客户机断开连接,然后再重新连接客户机。 如果将方式从使用 cleanSession=false 更改为 cleanSession=true,那么将废弃客户机的所有先前预订以及尚未接收的任何发布。