当前位置: 首页 > 知识库问答 >
问题:

项目反应器条件流的最佳实践

尉迟安民
2023-03-14

我正在使用spring webflux和project reactor构建一个有2层的API:控制器和服务。我的API所有的3个endpoint都发送并返回一个用Mono包装的请求/响应。在服务层中,我有两个类:第一个类调用几个带有单响应的webclients,第二个类是这些调用的类集成。我一直在努力构建单端调用的“管道”,因为业务流要求我需要调用WebClient1,执行一些验证,使用它的响应并调用WebClient2,执行验证调用WebClient3,如果在WebClient4中通过其他调用,则调用WebClient3,等等...我已经尝试过flatmap了,但对我来说,用这样的Mono创建条件流是不自然的:

业务流程图

正如您在图表中所看到的,对于我来说,实现反应式web客户机调用的条件流并不是一个简单的方法。有一个最佳实践来做这个whitout调用一个嵌套调用的flatmaps,和地图,并与良好的可读性我的代码?

共有1个答案

戚俊美
2023-03-14

您可以将条件语句放置到FlatMap并使用switchIfEmpty返回其他Publisher。一个简短的例子:

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

诸如此类...

 类似资料:
  • 问题内容: 我知道实际上没有唯一正确的方法。但是,我发现很难创建一个可以正常工作并且对每个开发人员和管理员都保持整洁的目录结构。github上的大多数项目都有一些标准结构。但是它没有显示在PC上组织另一个文件和所有项目的方法。 在开发机器上组织所有这些目录的最便捷方法是什么?你如何命名它们,以及如何连接并将其部署到服务器? 项目(你正在处理的所有项目) 源文件(应用程序本身) 存储库的工作副本(我

  • 我想组成一个Reactor链,基本上可以做到以下几点: 验证提交的属性,例如,的长度或的有效性。我会使用下面的验证器。 验证提交的是否已被其他人使用。为此,我将使用反应性存储库。 保存,如果以上所有验证检查都通过。 用户: 反应性存储库: 验证器: 处理程序方法: 助手方法: 从被动的角度来看,我不确定如何实现这一目标。理想情况下,反应链将有3个步骤映射到上面的点。 这是我尝试过的,但我在方法参数

  • 由于有多个实现提供了OAuth2功能,我们目前正在研究几个可用的选项。(例如Keycloak和ORY Hydra)。我们的选择取决于我们要做多少工作,改变应用程序的现有结构,如何处理数据库中的用户。但无论我们选择哪种实现方式,我们都将面临类似的问题。 问题 > react应用程序如何处理登录过程和令牌存储? 这同样适用于刷新令牌流。因为对于我自己的应用程序,我必须设置cookie,对于第三方,这必

  • 根据您的经验,将大型模块导入组件时的最佳实践是什么。你能从下面的例子中告诉我是什么和原因吗? 或

  • 问题内容: 我正在尝试收集一些默认设置,而我意识到我没有标准的一件事是.gitignore文件。有一个很棒的线程显示了一个很好的Visual Studio项目.gitignore,但是我没有看到很多关于Python和相关工具(PyGTK,Django)的建议。 到目前为止,我有… …用于编译的对象… …用于setuptools输出。 .gitignore文件有哪些最佳实践,我可以在哪里获得更多关于

  • 我用的是Spring助焊剂。我需要从不同的来源组装一个物体。如何确保两个流都返回了所需的数据? 比如: