#java #web #reactive-programming #spring-webflux #project-reactor
#java #веб #реактивное программирование #spring-webflux #проект-реактор
Вопрос:
Я работаю с spring webflux и project reactor, создавая API с 2 уровнями: контроллер и сервис. Все 3 конечные точки, которые есть в моем API, отправляют и возвращают запрос / ответ, завернутый в Mono. На уровне сервиса у меня есть два класса: первый вызывает несколько веб-клиентов с Mono-ответами, а второй — интеграция классов для этих вызовов. Я боролся с созданием «конвейера» из монофонических вызовов, потому что бизнес-поток диктует, что мне нужно вызвать webclient 1, выполнить некоторую проверку, использовать его ответ и вызвать webclient 2, выполнить проверку вызова webclient 3, если проходит иначе webclient 4 и так далее… Я пробовал с помощью flatmap, но для меня это не естественно создать условный поток с помощью Mono следующим образом :
Как вы можете видеть на диаграмме, для меня это непростой способ реализовать условный поток реактивных вызовов веб-клиента. Существует ли наилучшая практика для выполнения этого без вызова вложенных вызовов flatmaps и maps и с хорошей читаемостью моего кода?
Ответ №1:
Вы можете поместить условные операторы в flatMap
и использовать switchIfEmpty для возврата другого издателя. Короткий пример:
myService.executeWc1() // returns Mono
.flatMap(result -> myService.executeWc2(result))
.flatMap(result -> validator.validate(result))
.handle((result, sink) -> {
if (result) { // validation is passed
sink.success(true);
}
sink.success();
})
.flatMap(result -> myService.doSomeWork()
.flatMap(r -> myService.executeWc3())
.flatMap(r -> myService.doSomeWorkAgain())
.flatMap(r -> myService.executeWc4()))
.switchIfEmpty(myService.executeWc4())
и так далее…