【问题标题】:Best practices for Conditional Flow with Project ReactorProject Reactor 条件流的最佳实践
【发布时间】:2021-05-01 13:58:16
【问题描述】:
我正在使用 spring webflux 和 project reactor 构建一个包含 2 层的 API:controller 和 service .我的 API 发送和返回的所有 3 个端点 都用 Mono 包装了请求/响应。 在服务层中,我有两个类:第一个使用 Mono 响应调用多个 Web 客户端,第二个是这些调用的类集成。我一直在努力构建 Mono 调用的“管道”,因为业务流程要求我需要调用 webclient 1,进行一些验证,使用它的响应并调用 webclient 2,如果通过了 webclient 4,则执行验证调用 webclient 3 等等...我尝试过使用 flatmap,但对我来说创建这样的 Mono 条件流并不自然:
Business Flow Chart
正如您在图表中看到的那样,对于我来说,实现响应式 Web 客户端调用的条件流并不是一个简单的方法。
有一个最佳实践可以做到这一点,而无需调用平面地图和地图的嵌套调用,并且我的代码具有良好的可读性?
【问题讨论】:
标签:
java
web
reactive-programming
spring-webflux
project-reactor
【解决方案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())
等等……