springwebflux:多次有效地使用flux和/或mono流(可能?)

wvt8vs2t  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(581)

我有下面的方法,我调用几个reactiveMongorPositories来接收和处理某些文档。因为我对webflux还不太熟悉,所以我边学习边学习。
我觉得下面的代码不是很有效,因为我在同一时间打开多个流。这种无阻塞的代码编写方式使得从流中获取值并在级联平面图中重用该值变得复杂。
在下面的示例中,我必须调用userrepository两次,因为我希望在开始时调用用户,而不是以后。有没有可能用webflux更有效地做到这一点?

public Mono<Guideline> addGuideline(Guideline guideline, String keycloakUserId) {
        Mono<Guideline> guidelineMono = userRepository.findByKeycloakUserId(keycloakUserId)
                .flatMap(user -> {
                    return teamRepository.findUserInTeams(user.get_id());
                }).zipWith(instructionRepository.findById(guideline.getInstructionId()))
                .zipWith(userRepository.findByKeycloakUserId(keycloakUserId))
                .flatMap(objects -> {
                    User user = objects.getT2();
                    Instruction instruction = objects.getT1().getT2();
                    Team team = objects.getT1().getT1();
                    if (instruction.getTeamId().equals(team.get_id())) {
                        guideline.setAddedByUser(user.get_id());
                        guideline.setTeamId(team.get_id());
                        guideline.setDateAdded(new Date());
                        guideline.setGuidelineStatus(GuidelineStatus.ACTIVE);
                        guideline.setGuidelineSteps(Arrays.asList());
                        return guidelineRepository.save(guideline);
                    } else {
                        return Mono.error(new InstructionDoesntBelongOrExistException("Unable to add, since this Instruction does not belong to you or doesn't exist anymore!"));
                    }
                });
        return guidelineMono;
    }
2w3kk1z5

2w3kk1z51#

我将把我先前的评论作为答复。如果有人想为它编写正确的代码,那就继续吧。
我没有访问当前ide的权限,因此无法编写示例,但您可以从数据库获取指令开始。
留着吧 Mono<Instruction> 那你去拿你的 User 以及 flatMap 这个 User 去拿那个 Team 从数据库。那你呢 flatMap 组建一个团队 Mono<Tuple> 包括 Mono<Tuple<User, Team>> .
然后你拿你的2 Mono 选择和使用 zipWith 用一个 Combinator 功能和构建 Mono<Tuple<User, Team, Instruction>> 你可以平面Map。
所以基本上取1个项目,然后取2个项目,然后 Combinate 分为3项。可以使用 Tuples.of(...) 功能。

相关问题