获取 Mono 的结果以便将其传递到 JpaRepository 或另一个非反应性 class

Obtaining the result of a Mono in order to pass it onto a JpaRepository or another non reactive class

我想知道从 Mono(或 Flux)获取对象以传递给非反应性方法(例如 JpaRepository)的合适方法是什么。

这是我的做法:

@Service
public class ReactiveAccountService {

    //AccountService's methods take non-mono/non-flux objects as arguments
    private AccountService accountService;

    public ReactiveAccountService(AccountService accountService) {
        this.accountService = accountService;
    }

    public Mono<Void> signUp(Mono<Account> accountMono) {
        //Account is a Jpa entity
        accountMono.subscribe(account -> accountService.signUp(account));
        return Mono.empty();
    }

}

如何改进?有人可以请教吗?

更好的方法是这样的:

public Mono<Void> signUp(Mono<Account> accountMono) {
    //Account is a Jpa entity
    return accountMono.flatMap(account -> {
                  accountService.signUp(account);
                  return Mono.empty();
              });
}

这样您就可以遵循 Reactive Streams 的要求,并且不会用您的阻塞代码打扰执行流程。另外,根据 Spring WebFlux 要求,您无需在自己的代码中订阅,而是将所有内容都推迟到作为该 Mono<Account> 发起者的容器。当 Web (Reactive) 容器中有足够的资源来订阅返回的 Mono.

时,实际的执行就会发生