Клиент HiveMQ MQTT - Повторная подписка на темы при автоматическом переподключении

Я использую клиент HiveMQ MQTT в Spring для получения сообщений 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(...). Я также не смог найти никакой информации, делает ли это подписку более устойчивой к потерям соединения.

Буду признателен за любую информацию по этой теме.

Спасибо.


person Florian Hansen    schedule 07.08.2019    source источник


Ответы (1)


В настоящее время клиент HiveMQ MQTT будет продолжать получать сообщения о подписках только в том случае, если брокер сообщает о существующем сеансе в ConAck повторного подключения. Для этого требуются две вещи: 1) вам нужно установить cleanSession = false при первоначальном подключении и 2) брокер не должен терять сеанс между подключениями.

Для 1) вы можете попробовать добавить это в свое соединение:

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

С 2) это будет зависеть от брокера и причины потери соединения. Если это был «просто» сбой сети и брокер работал нормально в фоновом режиме, он должен работать нормально. Если брокер вышел из строя и был перезапущен, то ему потребуется, чтобы у брокера была настроена постоянство и чтобы он смог восстановить сеанс после перезапуска.

На самом деле на странице проекта github клиента HiveMQ MQTT есть несколько дискуссий относительно этой проблемы и необходимости добавления функций для автоматической повторной подписки даже в случае, если не было обнаружено ранее существовавшего сеанса. А также в соответствующей заметке, должны ли какие-либо публикации, выполненные при потере соединения, автоматически публиковаться, даже если после повторного подключения сеанс не был обнаружен. Если вам нужны эти функции, возможно, заходите туда и участвуйте в обсуждениях :)

Наконец, вы также можете вручную выполнить повторную подписку, добавив MqttClientConnectedListener при создании клиента, который затем может повторно создавать подписки при каждом автоматическом повторном подключении.

HTH
Ура,
C

person Clive Jevons    schedule 07.08.2019
comment
Спасибо за эту информацию. Я добавлю флаг cleanSession, как было предложено, и буду отслеживать результат. Я тоже думал об использовании подключенного слушателя. Если мы увидим больше проблем с подключением, я рассмотрю это и посмотрю, работает ли это лучше :) - person Florian Hansen; 08.08.2019
comment
Версия 1.2.0 клиента MQTT HiveMQ теперь автоматически восстанавливает свою подписку, если сеанс истекает и клиент подключается повторно. - person SgtSilvio; 22.04.2020