Spring Webflux:高效使用 Flux and/or 多次单声道流(可能?)
Spring Webflux: efficiently using Flux and/or Mono stream multiple times (possible?)
我有下面的方法,我调用了几个 ReactiveMongoRepositories 来接收和处理某些文档。由于我是 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;
}
我会 post 我之前的评论作为答案。如果有人想为它编写正确的代码,那就继续吧。
我无法访问 IDE 电流,因此无法编写示例,但您可以从从数据库中获取指令开始。
保留 Mono<Instruction>
,然后从数据库中获取 User
和 flatMap
User
并获取 Team
。然后你 flatMap
团队并建立一个由 Mono<Tuple<User, Team>>
.
组成的 Mono<Tuple>
之后你拿你的 2 Mono
s 和 use zipWith
with a Combinator
function 并构建一个 Mono<Tuple<User, Team, Instruction>>
你可以 flatMap over。
所以基本上取 1 个项目,然后取 2 个项目,然后 Combinate
变成 3 个项目。您可以使用 Tuples.of(...)
函数创建元组。
我有下面的方法,我调用了几个 ReactiveMongoRepositories 来接收和处理某些文档。由于我是 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;
}
我会 post 我之前的评论作为答案。如果有人想为它编写正确的代码,那就继续吧。
我无法访问 IDE 电流,因此无法编写示例,但您可以从从数据库中获取指令开始。
保留 Mono<Instruction>
,然后从数据库中获取 User
和 flatMap
User
并获取 Team
。然后你 flatMap
团队并建立一个由 Mono<Tuple<User, Team>>
.
Mono<Tuple>
之后你拿你的 2 Mono
s 和 use zipWith
with a Combinator
function 并构建一个 Mono<Tuple<User, Team, Instruction>>
你可以 flatMap over。
所以基本上取 1 个项目,然后取 2 个项目,然后 Combinate
变成 3 个项目。您可以使用 Tuples.of(...)
函数创建元组。