主线程上的助焊剂/发布器

时间:2018-10-30 19:30:29

标签: reactive-programming spring-webflux project-reactor

我是反应式编程/项目反应器的新手,试图理解这些概念。使用范围方法创建了一个助焊剂并进行了订阅。当我查看日志时,一切都在主线程上运行。

     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()

1 个答案:

答案 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和延迟,并且将以适当的方式安排工作,并且不会阻塞主应用程序线程。