Project Reactor-并行调度程序上的订阅不起作用

时间:2018-08-18 07:51:30

标签: kotlin project-reactor reactive-streams

我正在查看示例并阅读文档,并且在尝试以并行方式订阅Flux时发现了一些问题。

我有3个功能,如下所示。

private val log = LoggerFactory.getLogger("main")
private val sequence = Flux.just(1, 2)

fun a() {
    sequence.subscribeOn(Schedulers.parallel()).subscribe { log.info("*** {}", it) }
    sequence.subscribe { log.info(">>> {}", it) }
}

fun b() {
    sequence.subscribe { log.info(">>> {}", it) }
}

fun c() {
    sequence.subscribeOn(Schedulers.parallel()).subscribe { log.info("*** {}", it) }
}

现在,当我分别运行每种方法时,函数a()b()的输出正确,但是c()的输出为空。这是可以预期的,是设计使然吗?如果是这样,为什么会这样?

1 个答案:

答案 0 :(得分:2)

Flux.just(...)捕获值,因此经过优化,可以在订阅Thread中立即执行。

使用subscribeOn时,您可以将订阅Thread的内容从main更改为其他内容,从而使just真正是异步的。

a()中,如果没有subscribeOn,则第二个just会阻塞主线程,以至于在异步替代方法完成之前测试不会完成。

c()中,main线程没有这种阻塞。结果,测试在异步just有时间发出任何东西之前终止,这就是为什么看不到输出的原因。

要使其更加可见,请添加一个Thread.sleep(10),您将看到一些输出。