我正在使用moquette mqtt代理,我正在尝试理解实现以及MQTT代理。我希望对个人项目的经纪人进行一些修改。
我很好奇当设备向代理发送PUBLISH消息时,应该发生什么,并且代理无法将消息传递给订阅者。协议说PUBACK被发送回发布者。在moquette源代码中,这个PUBACK似乎是在将消息转发给任何订阅者之后发送的。
我注释掉sendPubAck()函数来模拟消息未成功发布,所以我假设发布者会再次发布消息。但是,当我在传入的消息处理函数旁边添加一个print语句时,我只看到从发布者定期发送到代理的PINGREQ消息。我没有看到任何发布消息。
我的问题如下:客户端设备究竟决定何时重新发布消息?因为注释掉sendPubAck()函数似乎不会让发布者重新发送消息。
答案 0 :(得分:1)
有两种选择。首先,如果没有收到PUBACK,您可以添加一个消息超时参数来触发再次发送PUBLISH。其次,您只能在重新连接时重新发送您的PUBLISH。
我认为第二种选择是最好的选择。原因在于经纪人(或客户当然,取决于沟通方向)没有回应的可能原因。
对于第一种情况,我们无能为力,除了修复经纪人。对于第二种情况,客户端必须在重新连接时重试发布。对于第三种情况,发送重复的PUBLISH将无助于代理响应,它将进一步超载它。
值得注意的是,在将PUBACK发送给发布客户端之前,代理不应该等待订阅客户端做出响应。