Какой лучший способ справиться с переподключением с MqttPahoMessageHandler, поскольку токен уже истек? - PullRequest
0 голосов
/ 10 марта 2020

Я использовал следующий пример в качестве основы для своего собственного кода для публикации sh на MQTT-сервере: https://github.com/spring-projects/spring-integration-samples/blob/master/basic/mqtt/src/main/java/org/springframework/integration/samples/mqtt/Application.java

У меня есть особый случай использования, когда пароль это токен, в частности токен Keycloak, срок действия которого истекает. Если по какой-либо причине приложение Spring теряет соединение с сервером MQTT и пытается восстановить соединение, срок действия токена истечет, и возникнет исключение MqttSecurityException: не авторизовано для подключения. Я попытался расширить метод connectionLost в MqttPahoMessageHandler, но так как MqttPahoClientFactory и IMqttAsyncClient являются частными окончательными, я мало что могу сделать. Хотите знать, есть ли какой-либо другой подход, о котором я не думал, или библиотека просто не предназначена для такого использования ???

Спасибо за любые ответы.

1 Ответ

0 голосов
/ 10 марта 2020

Мы получаем MqttConnectOptions от фабрики клиентов каждый раз, когда мы пытаемся подключиться , чтобы вы могли просто обновить там пароль.

Если это не работает для по какой-то причине откройте запрос новой функции .

РЕДАКТИРОВАТЬ

Что касается вашего комментария, что с этим не так?

    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        MqttConnectOptions options = new MqttConnectOptions();
        options.setServerURIs(new String[] { "tcp://localhost:1883" });
        options.setUserName("guest");
        options.setPassword("guest".toCharArray());
        factory.setConnectionOptions(options);
        return factory;
    }

    @Bean
    public ApplicationRunner runner(MqttPahoClientFactory mqttClientFactory, MqttPahoMessageHandler handler) {
        return args -> {
            Thread.sleep(30_000);
            System.out.println("Changing password");
            mqttClientFactory.getConnectionOptions().setPassword("foo".toCharArray());
            handler.stop();
            handler.start();
        };
    }
foo
2020-03-10 17:42:33.560  INFO 95638 --- [iSampleConsumer] siSample                                 
  : foo sent to MQTT, received from MQTT
Changing password
foo
2020-03-10 17:43:08.705 ERROR 95638 --- [ask-scheduler-3] o.s.integration.handler.LoggingHandler   
  : org.springframework.messaging.MessageHandlingException: error occurred in message handler [bean 'mqttOutbound' for component 'mqttOutFlow.org.springframework.integration.config.ConsumerEndpointFactoryBean#1'; defined in: 'com.example.demo.So60610337Application'; from source: 'org.springframework.core.type.StandardMethodMetadata@79da8dc5']; nested exception is org.springframework.messaging.MessagingException: Failed to connect; nested exception is Bad user name or password (4), failedMessage=GenericMessage [payload=foo sent to MQTT, headers={id=4eab5b52-726f-7ea3-252d-77c4d0401cc8, timestamp=1583876588662}]
...
Caused by: Bad user name or password (4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...