Как лучше всего обработать переподключение с 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)