Мой проект состоит из трех основных блоков: протокол MQTT, RabbitMQ в качестве брокера и Spring Integration.
Протокол MQTT отправляет закодированную строку eyJrZXkiOiJIZWxsbyBXb3JsZCJ9 брокеру, а Spring Integration потребляет и обрабатывает данные.
Как я могу декодировать/кодировать данные IntegrationFlow из Base64 eyJrZXkiOiJIZWxsbyBXb3JsZCJ9 в JsonObject {"key":"Hello World"}?
Какую функцию мне следует использовать из IntegrationFlow: Convert(), Transform() или Handle()? Какая логическая разница между этими тремя? Можете ли вы показать мне пример кода, как кодировать и декодировать данные.
@Bean
IntegrationFlow inboundFlow(MqttPahoMessageDrivenChannelAdapter inboundAdapter){
return IntegrationFlow
.from(inboundAdapter)
.transform( ... ) // How to implement decoder
.handle((payload, headers) -> {
System.out.println(payload);
return null;
})
.get();
}
Большая часть EIP — это просто варианты активатора службы, который представляет собой handle() в Java DSL. Все это предназначено для конкретного случая использования и удобства для ограниченной области применения. Поэтому вы можете просто реализовать свой собственный активатор службы для выполнения этой работы. В вашем случае действительно достаточно использовать transform(), поскольку он играет роль для преобразования полезной нагрузки сообщения.
Преобразование вам не поможет, поскольку вы не выполняете преобразование из одного типа в другой. У вас просто есть строка на входе, и, возможно, вы хотите иметь строку на выходе. Поэтому преобразование типов не требуется.
Как прокомментировал Мартин, вы можете использовать этот простой преобразователь:
transform(String.class, (in) -> Base64.getDecoder().decode(in))
В результате вы получите byte[]. Дальше вы можете сделать с этим что-нибудь еще.
Если я правильно понимаю, я могу использовать цепочку преобразователей для достижения необходимого типа данных? .transform(String.class, (in) -> new String(Base64.getDecoder().decode(in))) .transform(Transformers.fromJson()) .handle((полезная нагрузка, заголовки) -> { System.out .println(payload); return null; }) Мое первое преобразование декодирует Base64 в строку Json, и в следующем .transform(Transformers.fromJson()) таким образом я могу получить JsonObject?
Да. Правильно. Хотя вам не нужно заключать результат декодирования Base64 в строку. JsonToObjectTransformer может справиться с byte[]. Вместо этого вы можете подумать об использовании Transformers.fromJson(JsonObject.class). Если это именно тот тип, который вы ожидаете в своем приложении.
Артем, можешь пожалуйста ответить на этот вопрос stackoverflow.com/questions/78097626/…
Что-то вроде
transform(String.class, (in) -> Base64.getDecoder().decode(in))должно помочь.