Spring 弹簧体运行两次
我正在SpringWebFlux中尝试下面的代码,但它运行了2次。我使用SpringBoot2.3.3.RELEASE和MongoDB作为数据库 有3个名为sessionRepo、userRepo、requestRepo的存储库Spring 弹簧体运行两次,spring,spring-boot,reactive-programming,spring-webflux,Spring,Spring Boot,Reactive Programming,Spring Webflux,我正在SpringWebFlux中尝试下面的代码,但它运行了2次。我使用SpringBoot2.3.3.RELEASE和MongoDB作为数据库 有3个名为sessionRepo、userRepo、requestRepo的存储库 public Mono<CustomeResponse> createUpdateUser(Request request) { return sessionRepo .findBySid(request.getId()) .log()
public Mono<CustomeResponse> createUpdateUser(Request request) {
return sessionRepo
.findBySid(request.getId())
.log()
.flatMap(sessionInfo -> userRepo.findById(sessionInfo.getUid())
.log()
.map(quoteDocument -> {
// other update user logic
userRepo.save(user).subscribe();
return success;
})
.onErrorReturn().defaultIfEmpty())
.switchIfEmpty(createNewUser(request))
.onErrorReturn());
}
public Mono<Success> createNewUser(Request request){
return requestRepo.findById(request.getRequestInfo().getId())
.log()
.map(requestInfo -> {
// other create user logic
userRepo.save(user).subscribe();
return success;
})
.defaultIfEmpty()
.onErrorReturn();
}
公共Mono createUpdateUser(请求){
返回会话repo
.findBySid(request.getId())
.log()
.flatMap(sessionInfo->userRepo.findById(sessionInfo.getUid())
.log()
.map(引用文档->{
//其他更新用户逻辑
userRepo.save(user.subscribe();
回归成功;
})
.onErrorReturn().defaultIfEmpty())
.switchIfEmpty(createNewUser(请求))
.onerrorrurn());
}
公共Mono createNewUser(请求){
返回requestRepo.findById(request.getRequestInfo().getId())
.log()
.map(请求信息->{
//其他创建用户逻辑
userRepo.save(user.subscribe();
回归成功;
})
.defaultIfEmpty()
.onErrorReturn();
}
我注意到我的大部分代码运行了2次。但是所有的API都是我必须创建新ID的地方,就像会话ID一样,并将其发送到前端。它总是发送第二个ID,在数据库中创建一个副本
即使switchIfEmpty也会运行两次。
flatMap
在您的案例中逐个循环项目sessionRepo.findBySid(request.getId())
有多个项目,这就是为什么您的switchIfEmpty会运行两次您可以从最后确认吗?userRepo.save(user.subscribe()
也不好您不应该订阅。订户是消费者,因此在您的情况下,它是呼叫客户端(网页、移动应用程序),因为它们是发起呼叫的客户端,也是响应的最终目的地,因此您应该返回userRepo.save(user)。然后返回(success)
Hi@Toerktumlare,您是对的问题之一是.subscribe()。我已将示例代码添加到我的git repo:。自述文件中有关于我试图解决的问题的信息。flatMap
在您的案例中逐个循环项目sessionRepo.findBySid(request.getId())
有多个项目,这就是为什么switchIfEmpty会运行两次的原因。您可以从一端确认吗?userRepo.save(user.subscribe())
也不好,您不应该订阅。订户是消费者,因此在您的情况下,它是呼叫客户端(网页、移动应用程序),因为它们是发起呼叫的客户端,也是响应的最终目的地,因此您应该返回userRepo.save(user)。然后返回(success)
Hi@Toerktumlare,您是对的问题之一是.subscribe()。我已将示例代码添加到我的git repo:。自述文件包含关于我试图解决的问题的信息。