保留消息
每个主题只能存储一条保留消息
Retain As Published
Retain As Published = 0
转发时清除Retain标识Retain As Published = 1
转发时保留原始Retain标识
Retain Handling
Retain handling = 0
订阅建立时发送保留消息Retain handling = 1
订阅建立时,若该订阅当前不存在则发送保留消息Retain Handling = 2
订阅建立时不发送保留消息
遗嘱消息
1. 服务端检测到了一个1/O 故障或者网络故障2. 客户端在 Keep Alive 的时间内未能通讯3. 客户端在没有发送 Beason Code 为0的DISCONNECT 报文的情况下关闭了网络连接4. 服务端在没有收到 DISCONNECT 报文的情况下主动关闭了网络连接
实战场景
保留消息
1如何发布保留消息
发布消息时设置Retain 标识为1。2.保留消息可以被之后订阅的客户端接收
发布保留消息后再进行订阅。收到消息中的 Retain 标识为 13.保留消息会被转发给当前的订阅者
保持订阅,再次发布保留消息。收到消息中的 Retain 标识为04.一个主题下只能存在一条保留消息
向同一主题发布多条保留消息,订阅后只会收到最后一条保留消息5.可以通过通配符订阅获取多条保留消息
向多个主题发送保留消息,使用通配符订阅后会收到多条保留消息6.使用保留消息可能会导致收到重复的消息1.订阅 -> 发布保留消息 -> 重连、再次订阅2.发布保留消息 -> 订阅-> 重连、再次订阅7.如何清除保留消息
发送 Payload 为空的保留消息,注意当前的订阅者会收到这条消息8.为保留消息设置过期时间
发布消息时设置Message Expiry lnterval 属性9.Retain As Published 选项的作用
RAP 设置为0,转发时会清除 Retain 标识。
RAP 设置为1,转发时会保留 Retain 标识,不管是保留消息还是普通消息10.Retain Handling 选项的作用
RH 设置为 0,只要订阅,就会发送保留消息
RH 设置为 1,订阅建立时,如果该订阅当前不存在,才会发送保留消息。
RH 设置为 2,订阅不会发送保留消息。
MQTTX在重新订阅之前都会先取消订阅,所以这里我们用 paho.mgttpython 来模拟。
遗嘱消息
1.如何设置遗嘱消息
在连接时设置。2.遗嘱消息的触发
在EMQX中将ACL检查未通过时的动作改为断开连接,然后订阅 $SYS/#3.遗嘱延迟间隔
在连接时设置 Will Delay Interval 属性4.将遗嘱消息设置为保留消息
在连接时设置 Will Retain 字段
遗嘱消息和保留消息的配合
首先让客户端A在连接时将遗嘱主题设置为 client/a/status,遗嘱消息内容设置为moffline,并且将 Retain 标识设置为1。然后只要客户端A成功连接,就向 client/a/status 主题发布一个内容为 Im online的保留消息。这使得那些订阅了 client/a/status 这个主题的客户端,不管什么时候在线,都能够及时地获取到客户端A的最新状态