Как лучше всего обработать переподключение с MqttPahoMessageHandler, поскольку срок действия токена истек?

Я использовал следующий пример в качестве основы для моего собственного кода для публикации на сервере 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: Not authorized to connect. Я попытался расширить метод connectionLost в MqttPahoMessageHandler, но поскольку MqttPahoClientFactory и IMqttAsyncClient являются закрытыми окончательными, я мало что могу сделать. Интересно, есть ли какой-либо другой подход, о котором я не думал, или библиотека просто не предназначена для такого использования???

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

1 ответ

Мы получаем 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)
Другие вопросы по тегам