Как остановить повторную подписку сохраненных сообщений при интеграции весной mqtt после получения - PullRequest
0 голосов
/ 04 апреля 2019

Получение повторяющихся сохраненных сообщений при подписке на сохраненную тему.

Я использовал интеграцию Spring MQTT в своем проекте Iot. Здесь, как только полученное сообщение получено, оно продолжает подписку до тех пор, пока я не опубликую пустое сообщение в той же теме с установленным флагом «true». Я заметил, что когда я выполняю тот же процесс в терминале, используя команды mqtt, такие как подписка на сохраненную тему, он подписывается только один раз, повторная подписка не происходит.

Я использовал приведенный ниже код для подписки на все темы, используя #

@Bean
    public MessageChannel mqttInputChannel() {
        return new DirectChannel();
    }
    @Bean
    public DefaultMqttPahoClientFactory clientfactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        MqttConnectOptions options = new MqttConnectOptions();
        options.setUserName("username");
        options.setPassword("password".toCharArray());
        options.setCleanSession(false);
        //options.setCleanSession(true);
        //options.setServerURIs(new String[] { "tcp://localhost" });
        options.setServerURIs(new String[] { "url" });
        factory.setConnectionOptions(options);
        return factory;
    }

    @Bean
    public MqttPahoMessageDrivenChannelAdapter inbound() {

        MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter("admin",
                clientfactory(), "#");
        adapter.setConverter(new DefaultPahoMessageConverter());
        adapter.setQos(1);
        adapter.setOutputChannel(mqttInputChannel());
        /*adapter.setc*/
        return adapter;
    }

    @Bean
    @ServiceActivator(inputChannel = "mqttInputChannel")

    public MessageHandler handler() {
        return new MessageHandler() {

            public void handleMessage(Message<?> message) throws MessagingException {

            mqttSubscriptionProcessor.processSubscription(message);


            }

        };
    }

Я опубликовал сохраненное сообщение с помощью этой команды

mosquitto_pub -u admin -P pwd -t hello/topic  -m "test msg" -r -d

и результат в консоли eclipse равен

{mqtt_receivedRetained=true, id=48afaec5-debf-4927-ce06-a80556e479ac, mqtt_duplicate=false, mqtt_receivedTopic=hello/topic, mqtt_receivedQos=0, timestamp=1554363853214}
test msg

{mqtt_receivedRetained=true, id=48afaec5-debf-4927-ce06-a80556e479ac, mqtt_duplicate=false, mqtt_receivedTopic=hello/topic, mqtt_receivedQos=0, timestamp=1554363853214}
test msg

{mqtt_receivedRetained=true, id=48afaec5-debf-4927-ce06-a80556e479ac, mqtt_duplicate=false, mqtt_receivedTopic=hello/topic, mqtt_receivedQos=0, timestamp=1554363853214}
test msg 

{mqtt_receivedRetained=true, id=48afaec5-debf-4927-ce06-a80556e479ac, mqtt_duplicate=false, mqtt_receivedTopic=hello/topic, mqtt_receivedQos=0, timestamp=1554363853214}
test msg

Здесь мне нужно подписаться на оставшуюся тему только один раз, нужно внести изменения в код интеграции Spring.

1 Ответ

1 голос
/ 04 апреля 2019

Вот как работают сохраненные сообщения: последнее опубликованное сообщение с сохраненным битом, установленным для темы, всегда будет доставлено клиенту в первую очередь, когда он подписывается на соответствующую тему перед любыми новыми сообщениями.

Если вы не хотите, чтобы сообщение было сохранено (и, как таковое, всегда доставлено), не устанавливайте оставленный бит при публикации.

В противном случае, как вы обнаружили, вы можете очистить сохраненное сообщение для темы, опубликовав сообщение с нулевой полезной нагрузкой и сохраненным битом, установленным в ту же тему.

Или вы можете отфильтровать сообщения в клиенте, так как вы всегда можете проверить, установлен ли флаг сохранения в сообщении при его доставке.

Что касается весенней стороны, то похоже, что вы создаете 4 клиента, поэтому каждый из них получает сообщение при подписке. Вы можете доказать это, просмотрев журналы брокера: если вы запускаете mosquitto в подробном режиме, он будет показывать каждое сообщение, которое он доставляет.

...