【问题标题】:HiveMQ MQTT Client - Resubscribe topics on automatic reconnectHiveMQ MQTT 客户端 - 在自动重新连接时重新订阅主题
【发布时间】:2019-12-15 00:37:08
【问题描述】:

我在 Spring 中使用 HiveMQ MQTT 客户端来接收 MQTT 消息。

我的客户端配置如下所示

public Mqtt3AsyncClient mqtt3Client() {
    var mqtt3Client = Mqtt3Client.builder()
            .serverHost("my.host")
            .sslWithDefaultConfig()
            .serverPort(0000)
            .automaticReconnectWithDefaultConfig()
            .buildBlocking();

    mqtt3Client.connect();
    return mqtt3Client.toAsync();
}

客户端可用后,使用客户端初始化另一个Spring Bean。它订阅了一个主题:

@PostConstruct
public void subscribeTopic() {
    mqtt3AsyncClient.subscribeWith()
            .topicFilter("topicfilter")
            .qos(MqttQos.AT_LEAST_ONCE)
            .callback(message -> {
                /*Handle message*/
            })
            .send()
            .whenComplete((mqtt3SubAck, throwable) -> {
                if (throwable != null) {
                    /*Logging*/
                } else {
                    /*Logging*/
                }
            });
}

我多次看到没有更多消息传递到我的应用程序,而我仍然能够使用客户端连接发送消息(因此它当时已连接)。

我找不到任何关于 HiveMQ MQTT 客户端如何处理配置的automaticReconnectWithDefaultConfig() 的文档。谁能指出,我在subscribeTopic() 中创建的订阅是否被重新订阅? 我还找到了可以替换.topicFilter(..).qos(...) 部分的方法addSubscription()。我也找不到任何信息,这是否会使订阅对连接丢失更具弹性。

如果您能提供有关该主题的任何信息,我将不胜感激。

谢谢。

【问题讨论】:

    标签: mqtt hivemq


    【解决方案1】:

    目前,如果代理在重新连接的 ConAck 中报告现有会话,HiveMQ MQTT 客户端将仅继续接收订阅消息。这需要两件事 - 1) 您需要在初始连接时设置 cleanSession = false,以及 2) 代理需要在连接之间没有丢失会话。

    对于 1),您可以尝试将其添加到您的连接中:

    client.connectWith().cleanSession(false).send();
    

    对于 2),它将取决于代理以及连接丢失的原因是什么。如果它“只是”网络中断并且代理在后台运行正常,那么它应该可以正常工作。如果代理崩溃并重新启动,则需要代理已配置持久性并且能够在重启后重新建立会话。

    实际上,在 HiveMQ MQTT 客户端的 github 项目页面上有几个关于这个问题的讨论,以及是否应该添加功能以自动重新订阅,即使在没有找到预先存在的会话的情况下也是如此。并且在相关说明中,即使在重新连接后没有找到会话,在连接丢失时完成的任何发布是否都应该自动发布。如果这些是您需要的功能,也许可以跳到那里并参与讨论:)

    最后,您还可以通过在构建客户端时添加 MqttClientConnectedListener 手动执行重新订阅,然后每次自动重新连接发生时重新创建订阅。

    HTH
    干杯,
    C

    【讨论】:

    • 感谢您提供这些见解。我将按照建议添加 cleanSession 标志并监控结果。使用连接的监听器也是我正在考虑的事情。如果我们看到更多的连接问题,我会考虑这个,看看它是否效果更好:)
    • HiveMQ MQTT 客户端 1.2.0 版现在会在会话到期且客户端重新连接时自动恢复其订阅。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 2017-10-17
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多