gpt4 book ai didi

javascript - 当代理关闭并启动时,Node JS mqtt 客户端不会收到订阅的消息

转载 作者:行者123 更新时间:2023-11-30 16:03:58 25 4
gpt4 key购买 nike

我已经创建了一个 mqtt node js 客户端。我的连接选项如下。

mqttOptions = {
clientId: '100',
keepAlive: 1000,
clean: false,
reconnectPeriod: '1000',
will: willMessage
};

当客户端仍在运行时,我断开了服务器的连接并再次启动它。客户端具有每 1 秒发布一次的逻辑。虽然客户端在此重新连接后正在发布,但它没有收到消息。它订阅了自己的消息主题。由于我将 clean 选项设置为 false,它不应该在重新连接时订阅主题并开始接收它们吗?

enter image description here

下面是我如何建立连接。

this.client = mqtt.connect(url, mqttOptions);

以下是我的订阅方式。

this.client.subscribe(topic);

我在这里做错了什么?请指教。

最佳答案

我们在使用 EMQ 作为代理和用于 NodeJS 的 mqtt 库时遇到了这个问题。当它是 mosquitto 作为代理时,客户端重新连接并获取它订阅的所有消息。但是,如果它再次订阅,它会获得 n 份相同消息的副本。根据库文档,建议检查 connackconnack.sessionPresent 是否有以前的订阅。

我们订阅了客户端的所有事件,发现 offline 是在 broker 宕机时调用的事件。然后调用 reconnectclose 直到代理启动。因此,这就是我们是如何做到的。在离线时,强制结束客户端,并在结束时创建一个新客户端 - 与创建客户端相同的函数:

doConnect() {
this.client = mqtt.connect('mqtt://myhost', this.myOptionsIfAny);
this.client.on('connect', () => {
this.client.subscribe('mytopics');
this.client.on('message', (topic, message) => {
// do processing
});
this.client.on('offline', () => {
this.client.end(true, () => {
doConnect();
});
});
}

关于javascript - 当代理关闭并启动时,Node JS mqtt 客户端不会收到订阅的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37312983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com