我是反应式编程/项目反应器的新手,试图理解这些概念。使用范围方法创建了一个助焊剂并进行了订阅。当我查看日志时,一切都在主线程上运行。
Flux
.range(1, 5)
.log()
.subscribe(System.out::println);
System.out.println("End of Execution");
[DEBUG](主要)使用控制台日志记录[INFO](主要)| onSubscribe([Synchronous Fuseable] FluxRange.RangeSubscription)[ INFO](主要)|请求(无界)[INFO](主要)| onNext(1)1 [信息] (主要)| onNext(2)2 [信息](主要)| onNext(3)3 [信息](主要)| onNext(4)4 [信息](主要)| onNext(5)5 [信息](主要)| onComplete() 执行结束
一旦发布者完成所有元素的发送,则仅执行其余代码(在上例中为 System.out.println(“ Execution”); )。 Publisher会默认阻止线程吗?如果我更改了调度程序,似乎没有阻塞线程。
Flux
.range(1, 5)
.log()
.subscribeOn(Schedulers.elastic())
.subscribe(System.out::println);
System.out.println("End of Execution");
Thread.sleep(10000);
[DEBUG](主要),使用控制台日志记录执行结束 [信息] (弹性2 )| onSubscribe([同步可熔] FluxRange.RangeSubscription)[信息]( elastic-2 )|请求(无限制) [INFO](弹性2 )| onNext(1)1 [信息](弹性2 )| onNext(2)2 [ INFO](弹性2 )| onNext(3)3 [信息](弹性2 )| onNext(4)4 [ INFO](弹性2 )| onNext(5)5 [信息](弹性2 )| onComplete()
答案 0 :(得分:3)
默认情况下,Reactor不会强制执行并发模型,是的,许多操作员将继续进行Thread
操作的subscribe()
上的工作。
但这并不意味着使用Reactor会阻塞主线程。您显示的示例正在执行内存工作,不涉及I / O或延迟。另外,它正在立即订阅结果。
您可以尝试以下代码片段,并看到不同的内容:
Flux.range(1, 5)
.delayElements(Duration.ofMillis(100))
.log()
.subscribe(System.out::println);
System.out.println("End of Execution");
在日志中,我看到:
INFO --- [main] reactor.Flux.ConcatMap.1 : onSubscribe(FluxConcatMap.ConcatMapImmediate)
INFO --- [main] reactor.Flux.ConcatMap.1 : request(unbounded)
End of Execution
在这种情况下,延迟元素将以不同的方式安排工作-由于此处没有任何东西可以使JVM保持活动状态,因此应用程序将退出,并且不会消耗该范围中的任何元素。
在更常见的情况下,将涉及I / O和延迟,并且将以适当的方式安排工作,并且不会阻塞主应用程序线程。