java 在mono方法之外构建POJO会导致阻塞行为吗?

b4lqfgs4  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(120)

目前我有一个方法,看起来像这样:

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()方法之外?
我不知道我将如何去调试这个。

hgc7kmma

hgc7kmma1#

如果你的AuthenticationRequest构建器是一个简单的POJO构建器,没有任何数据库调用或同步方法等,它不会导致任何阻塞。
通常,建议将这样的代码移动到链中。在Reactor中,在你订阅之前什么都不会发生,但是如果你将代码移动到链之外,它可以在订阅之前执行(作为链组装阶段的一部分)。
例如,即使Reactor链上没有订阅,这段代码也会打印“hello world”:

public static void main(String[] args) {
    getData();
}

public static Mono<String> getData() {
    var req = new MyRequest(1);
    System.out.println("hello world");
    return Mono.defer(() -> Mono.just(req))
        .map(Object::toString);
}

但这段代码什么也不打印:

public static void main(String[] args) {
    getData();
}

public static Mono<String> getData() {
    return Mono.defer(() -> {
            var req = new MyRequest(1);
            System.out.println("hello world");
            return Mono.just(req);
        })
        .map(Object::toString);
}

查看更多详情:https://stackoverflow.com/a/76275996/6933090
但实际上,在你的例子中,如果你把它移到Mono.defer之外(就像你的例子中那样),应该不会发生任何错误,但是把它移到这样的链中会更好:

Mono.fromCallable(() -> AuthenticationRequest.builder()
        .withAuthenticationProvider(provider)
        .withRedirectUri(redirectUri)
        .withSubject(subject)
        .build())
    .map(req -> authenticationClient.authenticate(req))
    .map(this::mapAuthenticateResponse)

相关问题