Лучшие практики для условного потока с Project Reactor

#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())
 

и так далее…