HiveMQ MQTT客户端-重新订阅有关自动重新连接的主题

时间:2019-08-07 11:23:13

标签: mqtt hivemq

我正在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()中创建的我的订阅? 我还发现方法addSubscription()可以代替.topicFilter(..).qos(...)部分。我也找不到任何信息,这是否可使订阅对连接丢失有更强的恢复能力。

我很乐意提供有关该主题的任何信息。

谢谢。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

HiveMQ MQTT客户端的github项目页面上实际上有一些关于此问题的讨论,即使在没有预先存在的会话的情况下,是否应将功能添加到自动重新订阅中。还要注意的是,即使在重新连接后未找到会话的情况下,在连接断开时是否完成了任何发布也应自动发布。如果您需要这些功能,则可以跳到那边进行讨论:)

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

HTH
干杯,
C