尝试搜索一些有关此用法的信息,但尚未找到明确的答案。在阻塞操作上使用 flatMap(非反应式)。当像 outboundCalls 这样的一些操作是响应式的时,我们可以立即使用 flatMap 使其异步且非阻塞。
.flatMap(data -> outboundCall(data))
但是当
outboundCall
是非反应性时,问题就来了。
.map(data -> outboundCall(dbData))
对
.flatMap(data -> Mono.just(outboundCall(data)))
在 flatMap 中使用 Mono.just 进行包装真的有任何好处吗?或者只是会产生一些开销?
在反应式上下文中,如果要执行阻塞操作,理想情况下应该将该工作卸载到单独的线程上,以免阻塞主反应流。您可以将
Mono.fromCallable()
与 .subscribeOn()
一起使用,将阻塞调用移至不同的线程,如下所示:
.flatMap(data -> Mono.fromCallable(() -> outboundCall(data))
.subscribeOn(Schedulers.boundedElastic()))
这种方法利用了
Schedulers.boundedElastic()
调度程序,该调度程序适用于缓慢、阻塞的任务。它避免阻塞主要反应流并根据需要施加背压。