Несколько клиентов MQTT подписаны на одну и ту же тему

На самом деле у меня есть приложение весенней загрузки с клиентом MQTT, которое подписано на тему.

Я сталкиваюсь с проблемой, когда помещаю 2 экземпляра своего приложения (2 контейнера/модуля), потому что оно создает 2 подключения к издателю! Проблема в том, что я записываю вещи в базу данных для каждого сообщения, поэтому я получаю данные 2 раза! Один из стручка, а один из второго... и так 2 записи в базе...

Это мой фактический код:

.
..
...
....
    @Bean
    public MqttConnectOptions getReceiverMqttConnectOptions() {
        MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
        mqttConnectOptions.setCleanSession(true);
        mqttConnectOptions.setConnectionTimeout(30);
        mqttConnectOptions.setKeepAliveInterval(60);
        mqttConnectOptions.setAutomaticReconnect(true);

        mqttConnectOptions.setUserName(bean.getProperty("username"));
        String password = bean.getProperty("password");
        String hostUrl = bean.getProperty("url");

        mqttConnectOptions.setPassword(password.toCharArray());
        mqttConnectOptions.setServerURIs(new String[] { hostUrl });
        return mqttConnectOptions;
    }

    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(getReceiverMqttConnectOptions());
        return factory;
    }

    @Bean
    public MessageChannel mqttInputChannel() {
        return new DirectChannel();
    }

    @Bean
    public MessageProducer inbound() {
        String clientId = "client-id" + UUID.randomUUID().toString();
        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(clientId, mqttClientFactory(), "jenkins");
        adapter.setCompletionTimeout(20000);
        adapter.setConverter(new DefaultPahoMessageConverter());
...
..
.

Если у кого-то из вас есть решение, позволяющее использовать 2 модуля моего приложения без создания 2 соединений MQTT. Спасибо.

Вы имеете в виду, что у вас действительно есть 2 клиента, которые подписались на одну и ту же тему, поэтому оба получают одни и те же сообщения?

hardillb 19.12.2020 20:06

Да, 2 модуля (контейнера), поэтому 2 клиента подписались на одну и ту же тему. Так что да, они получают каждое сообщение :(

Kévin 19.12.2020 20:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
919
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо использовать брокера, который поддерживает общие подписки (эта функция добавлена ​​в стандарт MQTTv5, но некоторые брокеры не поддерживали стандартные версии в v3)

Общие подписки позволяют группам клиентов подписываться на тему (или тему с подстановочными знаками), и любое данное сообщение, опубликованное в этой теме, будет доставлено только одному из группы клиентов.

Подробнее об общих подписках можно прочитать здесь

Вы правы, спасибо за информацию!

Kévin 19.12.2020 20:26

Другие вопросы по теме