某个Topic配置了订阅关系清理功能后,当订阅者的客户端离线并超过指定时间后,云消息队列 MQTT 版会删除订阅者与该Topic的订阅关系。若不清理订阅关系,订阅者客户端离线期间订阅关系将持续生效,当客户端再次上线时,云消息队列 MQTT 版将自动加载离线消息并下发到客户端。若您对离线消息有时效性要求或业务侧判断订阅者失效不需再使用时,可以通过此功能清理订阅的Topic关系。
使用说明
操作步骤
若开启订阅关系清理功能,客户端将收不到离线消息,请慎重操作。
登录云消息队列 MQTT 版控制台,并在左侧导航栏单击实例列表。
在顶部菜单栏选择目标地域,然后在实例列表中单击实例名称进入实例详情页面。
在左侧导航栏单击Topic 管理,然后在Topic列表中找到目标Topic,在其操作列,选择。
在弹出的自动清理周期配置面板,设置开启自动订阅关系清理和清理周期,单击确定。
开启自动订阅关系清理设置为是:当系统当前时间−客户端最后一次心跳时间≥清理周期时,系统将清理订阅者与该Topic的订阅关系。订阅关系清理后,客户端将收不到该Topic产生的离线消息。
重要当客户端再次上线时,依然可以接收到订阅关系清理前产生的、且在有效期内的离线消息。
开启自动订阅关系清理设置为否:订阅者客户端离线期间,系统不会清理订阅者与该Topic的订阅关系,订阅关系持续生效。
配置完成后,您可以在Topic列表的订阅关系清理周期列查看Topic的清理周期。
客户端主动取消订阅
MQTT 协议在客户端在线状态下不支持自动清理旧订阅关系。切换 Topic 时,需调用 SDK 的 unsubscribe 方法取消旧订阅,再订阅新 Topic。
控制台的订阅关系清理功能仅针对离线场景:客户端离线超过指定时间后触发删除,不适用于在线切换。
Java SDK 示例:
MqttClient mqttClient = new MqttClient("tcp://" + endPoint + ":1883", clientId, new MemoryPersistence());
mqttClient.connect(options);
// 订阅topicA
mqttClient.subscribe("topicA", 1);
// 切换到topicB前,先取消topicA订阅
mqttClient.unsubscribe("topicA");
// 再订阅topicB
mqttClient.subscribe("topicB", 1);
先调用 unsubscribe 取消旧 Topic 订阅,再调用 subscribe 订阅新 Topic,避免两个订阅同时生效。