遗嘱消息
简介
MQTT中,客户端可以在连接时在服务端中注册一个遗嘱消息
.与普通消息类似,我们可以设置消息主题、有效载荷等等。当客户端意外断开,服务端就会向其他订阅客户端发送此遗嘱消息
,这些接收者可及时地采取相应的操作。例如:向用户发送通知、切换备用设备等等。
作用
借助遗嘱消息可以感知到客户端是意外断开
原理
指定时机
- 客户端发起连接时指定
消息
- 消息内容
与普通消息类似,可以为遗嘱消息设置主题(Will Topic)、保留消息标识位(Will Retain)、属性(Will Properties)、QoS(Will QoS)和有效载荷(Will Payload)。
- 普通消息差异
- 不能指定主题别名
- 需要配置
Will Delay Interval
Will Delay Interval
作用
:决定了服务端将在网络连接关闭后延迟多久发布遗嘱消息,单位: 秒。
- 没有指定 Will Delay Interval 或 设置为 0
默认情况即如此,服务端会在网络连接意外断开时立即发布遗嘱消息
- 设置为一个大于 0 的值
- 若客户端在 Will Delay Interval 时间内恢复连接,则不发布遗嘱消息
- 反之,才会向其他订阅客户端发送此遗嘱消息
遗嘱消息与会话
- 遗嘱消息是会话状态的一部分
- 会话结束,遗嘱消息也无法继续单独存在
- 在遗嘱消息延迟发布期间,会话可能过期; 若过期则发布遗嘱消息
- 客户端在新的连接中设置Clean Start 为 1(服务端需要丢弃之前的会话);避免丢失遗嘱,即便 Will Delay Interval 还没有到期,服务端也会发布遗嘱消息
何时发布遗嘱消息:取决于
Will Delay Interval 到期
和会话结束
这两种情况谁先发生
。
遗嘱演示
- 发布者设置遗嘱消息
- 主题
test/will
- 消息内容
- 间隔时间
20s
- 主题
- 创建订阅者
- 订阅主题
test/will
- 订阅主题
- 模拟意外断开
关闭发布者,右键打开新窗口
新窗口建立连接后
直接关闭窗口
订阅者消息查看