在MQTT规范中,有控制服务器和客户端的保持和状态的连接标志。
干净的会话规格说明建议:
3.1.2.4清洁会话位置:连接标志字节的第1位。 此位指定会话状态的处理。客户端和服务器可以存储会话状态,以便在网络连接序列中继续可靠的消息传递。此位用于控制会话状态的生存期。 如果CleanSession设置为0,服务器必须根据当前会话中的状态(由客户端标识符标识)恢复与客户端的通信。如果没有与客户端标识符关联的会话,服务器必须创建新会话。客户端和服务器必须在客户端和服务器断开连接后存储会话MQTT-3.1.2-4。 将CleanSession设置为0的会话断开后,服务器必须存储进一步的QoS 1和QoS 2消息,这些消息与客户端断开连接时的任何订阅相匹配,作为会话状态的一部分
因此,每当客户端在断开连接后再次连接时,代理将中继所有未被确认的QoS-1和QoS-2消息。经纪人有个州。为了维护每个客户端的状态,服务器将使用一些数据库进行保留。是否有办法为这些消息状态(服务器将存储的)提供生存时间。如何告诉经纪人放弃(即,不转发)任何旧的信息,比如说5天。
基本上,我们希望在QoS-1中使用干净的session =0;但是如何用旧消息清除代理状态呢?不希望收到超过5天的旧消息,即使是在未被确认的情况下。
发布于 2019-06-27 15:53:44
MQTT 5.0允许为发布设置消息过期间隔。
3.3.2.3.3消息到期时间 2 (0x02) Byte,消息到期间隔的标识符。 后面是四字节整数,表示消息到期时间间隔。 如果存在,则四个字节值是应用程序消息的生存期(以秒为单位)。如果消息过期时间已经过去,而服务器没有设法开始向匹配的订阅服务器传递,那么它必须删除该订阅服务器MQTT-3.3.2-5的消息副本。 如果没有,则应用程序消息不会过期。 服务器发送到客户端的发布数据包必须包含设置为接收值的消息过期间隔,减去应用程序消息在Server 3.3.2-6中等待的时间。有关存储状态的详细信息和限制,请参阅4.1节。
发布于 2018-01-02 11:05:28
简单地说,你不能(同时保持在v3.0规范内)。
根据规范,客户端的持久状态需要无限期地保持。
您没有提到您使用的是哪个经纪人,但蚊子确实有以下(无标准)选项:
persistent_client_expiration持续时间 此选项允许持久化客户端(那些将干净会话设置为false的客户端)被移除,如果它们没有在特定的 时间框架。这是一个非标准的选择。就MQTT规范而言,持久性客户永远存在。 设计糟糕的客户端可能会将干净会话设置为false,同时使用随机生成的客户端id。这将导致持久的客户端 永远不会重新连接。此选项允许删除这些客户端。 过期期应为整数,其后分别为小时、日、周、月和年的h_d_m。例如: persistent_client_expiration 2m persistent_client_expiration 14d persistent_client_expiration 1y,因为这是一个非标准的选项,默认的如果不设置的话就是永远不过期持久客户端。
这意味着,如果客户端脱机时间超过指定时间,则该客户端的所有排队消息都将被转储(不再排队)。
这可能是你能得到的最接近你想要的。
https://stackoverflow.com/questions/48061029
复制