Spring 弹簧体运行两次

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

我正在SpringWebFlux中尝试下面的代码,但它运行了2次。我使用SpringBoot2.3.3.RELEASE和MongoDB作为数据库

有3个名为sessionRepo、userRepo、requestRepo的存储库

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:。自述文件包含关于我试图解决的问题的信息。