如何在spring的服务调用中获得mono qs param值

u91tlkcl  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(331)

我是一个新的React,所以有点挣扎与范式的转变,但也许有人能帮我克服这一点?
我的控制器将mono(称为“limit”)作为服务参数传递给我的服务。mono在subscribe上发出一个整数,服务使用该整数来执行其工作,它返回一个通量。
在我的服务方法中,我需要订阅mono,但是我需要在我的服务方法(对其他端点进行web客户端rest调用)之前订阅mono,因为rest调用中需要限制值。现在,我知道subscribe将在某个时候完成,但是它是在主线程继续完成方法之后完成的。我的代码:

public Flux<User> getUserdata(Mono<Integer> limit) {

        return
                Flux.from(WebClient.create()
                        .get()
                        .uri(uriBase, uri -> {
                            uri.queryParam("_limit", limit.subscribe(k -> String.valueOf(k)));
                        })
                        .accept(MediaType.APPLICATION_JSON)
                        .retrieve()
                        .bodyToFlux(User.class));
}

如果我硬编码limit参数,这就行了。我需要的人来确保订阅完成。我知道我仍然对sync/async有点混淆,所以有什么想法/建议如何以React/正确的方式来做这件事?
蒂亚,
彼得

noj0wjuj

noj0wjuj1#

Mono 以及 FluxProducers . 就是那个 subscribing 被称为 Consumer . 对你来说,最后 Consumer 可能是发起呼叫的人。很可能是一个网页,或其他服务调用您的服务。
我的意思是既然你是 producer 很可能你不该打电话 subscribe 既然你不是决赛 consumer . 一旦你看到自己这样做,你可以告诉这是一个代码气味。
我已经重写了你提供的例子下面与一些意见。

public Flux<User> getUserdata(Mono<Integer> limit) {

    // Should be created in a @Configuration annotated, as a 
    // @Bean WebClient is quite a large class and can affect performance.
    final WebClient webclient = WebClient.create();

    // We flatMap incoming mono to get the value, and then
    // call webClient, bodyToFlux returns a Flux for us.
    return limit.flatMap(l -> webClient.get()
                        .uri(uriBase, uri -> {
                            uri.queryParam("_limit", String.valueOf(l))
                               .build());
                        })
                        .accept(MediaType.APPLICATION_JSON)
                        .retrieve()
                        .bodyToFlux(User.class));
}

相关问题