目前我有一个方法,看起来像这样:
public Mono<Either<CommunicationException, AuthenticateResponse>> authenticate(String provider, String subject, String redirectUri) {
final var req = AuthenticationRequest.builder().withAuthenticationProvider(provider).withRedirectUri(redirectUri).withSubject(subject).build();
return Mono.defer(() -> Mono.just(authenticationClient.authenticate(req))
.map(this::mapAuthenticateResponse)
.map(Either::<CommunicationException, AuthenticateResponse>right))
.doOnError(err -> LOGGER.error("Failed to authenticate", err))
.onErrorResume(e -> Mono.just(new CommunicationException(e.getMessage())).map(Either::left));
}
我有点不确定它如何与React链,这将是非阻塞,即使请求是建立在Mono.defer()方法之外?
我不知道我将如何去调试这个。
1条答案
按热度按时间hgc7kmma1#
如果你的
AuthenticationRequest
构建器是一个简单的POJO构建器,没有任何数据库调用或同步方法等,它不会导致任何阻塞。通常,建议将这样的代码移动到链中。在Reactor中,在你订阅之前什么都不会发生,但是如果你将代码移动到链之外,它可以在订阅之前执行(作为链组装阶段的一部分)。
例如,即使Reactor链上没有订阅,这段代码也会打印“hello world”:
但这段代码什么也不打印:
查看更多详情:https://stackoverflow.com/a/76275996/6933090
但实际上,在你的例子中,如果你把它移到
Mono.defer
之外(就像你的例子中那样),应该不会发生任何错误,但是把它移到这样的链中会更好: