Project Reactor Mono.就在 flatMap 中

问题描述 投票:0回答:1

尝试搜索一些有关此用法的信息,但尚未找到明确的答案。在阻塞操作上使用 flatMap(非反应式)。当像 outboundCalls 这样的一些操作是响应式的时,我们可以立即使用 flatMap 使其异步且非阻塞。

  .flatMap(data -> outboundCall(data))

但是当

outboundCall
是非反应性时,问题就来了。

  .map(data -> outboundCall(dbData))

  .flatMap(data -> Mono.just(outboundCall(data)))

在 flatMap 中使用 Mono.just 进行包装真的有任何好处吗?或者只是会产生一些开销?

java spring-webflux project-reactor
1个回答
0
投票

在反应式上下文中,如果要执行阻塞操作,理想情况下应该将该工作卸载到单独的线程上,以免阻塞主反应流。您可以将

Mono.fromCallable()
.subscribeOn()
一起使用,将阻塞调用移至不同的线程,如下所示:

.flatMap(data -> Mono.fromCallable(() -> outboundCall(data))
                      .subscribeOn(Schedulers.boundedElastic()))

这种方法利用了

Schedulers.boundedElastic()
调度程序,该调度程序适用于缓慢、阻塞的任务。它避免阻塞主要反应流并根据需要施加背压。

© www.soinside.com 2019 - 2024. All rights reserved.