当前位置: 首页 > 知识库问答 >
问题:

如何在Spring的服务调用中获取Mono-QS-param值

范振海
2023-03-14

我对反应性非常陌生,所以在范式转变中有点挣扎,但是也许有人能帮我克服这个问题?

我的控制器将Mono(称为“limit”)作为服务参数传递给我的服务。Mono在subscribe上发出一个整数,服务使用该整数执行其工作,该整数返回一个流量。

在我的服务方法中,我需要订阅mono,但我需要在我的服务方法(对其他endpoint进行web客户端REST调用)之前订阅mono,因为REST调用中需要限制值。现在,我知道订阅将在某个点完成,但它是在主线程继续完成方法之后完成的。我的代码:

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有点混淆,所以关于如何反应性地/正确地做到这一点,有什么想法/建议吗?

蒂亚,

彼得

共有1个答案

岑彬炳
2023-03-14

MonoFlux制作人订阅的用户称为消费者。在您的情况下,最终的消费者可能就是发起呼叫的消费者。很可能是一个网页,或另一个调用您的服务的服务。

我的意思是,既然你是制作人,你就不应该打电话给订阅,因为你不是最终的消费者。一旦你看到自己在做这件事,你就会知道这是一种代码气味。

我在下面重写了您提供的示例,并提供了一些注释。

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));
}

 类似资料:
  • 我尝试使处理程序和路由器类的Spring引导webflow。模型类是用户类。代码是 下面是webflux项目的处理程序类。在register方法中,我编写了id复制测试代码。但这是完全错误的。 我想提取的用户名或id字符串从Mono的Spring webflow.将需要任何评论。我被这部分卡住了。

  • 我有一个接受Mono作为参数的方法。我只想从中得到实际的字符串。Googled但是除了调用Mono对象上的block(),没有找到答案,但是它会进行阻塞调用,所以要避免使用block()。如果可能的话,请建议其他方法。我之所以需要这个字符串,是因为在这个方法中,我需要用实际的字符串值调用另一个方法,比如print()。我明白这很容易,但我是反应性编程的新手。 代码:

  • 对于反应编程和尝试通过WebFlux和WebClient创建反应服务是新的。 方法的流程类似于 发布请求并等待返回响应 映射服务的响应体(具有其他业务逻辑),并返回建议类型 创建ResponseEntity 创建Mono 类型的Mono

  • 所以我使用executorservice创建了一个线程池。 我试图访问线程池队列中的任务数。我看到没有办法得到它。我知道有一些方法来获取线程池执行器中的队列大小,但是我如何使用执行器服务对象来实现这一点。 就像我说的,如果我创建了一个像这样的线程池执行器,我可以得到队列信息 我知道我可以使用tpExecutor。队列size()获取线程池队列中的任务数。但目前我已经使用Executor服务声明了我

  • 嗨,我尝试用InMemoryDao获取userDetailsService。但是我得不到,我试过@Autowired,@ Inject(userdailsservice,InMemoryDaoImpl,InMemoryManager...)但是我不能让它工作。 有公共类安全扩展WebSecurityC 只尝试了WebSecurityCon

  • 我需要能够在运行时告诉kotlin集合的泛型类型。我怎么做?