获取 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
.
时,实际的执行就会发生
我想知道从 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
.