如果在Project Reactor中使用publishOn,Subscibe不会打印出任何日志

时间:2019-09-14 12:35:59

标签: spring-webflux project-reactor

根据 As of SLF4J version 1.8.0, the static binder mechanism (StaticLoggerBinder) is deprecated. This class exists for backward compatibility earlier versions of slf4j-api.jar, in particular in the 1.6.x and the 1.7.x series. Note that this class is likely to be removed in future releases of SLF4J. 这本书,我得到了一个非常简单的信息流。

Hands-On Reactive Programming in Spring 5

但是,根本没有控制台输出。但是,如果我在Flux.just(1, 2, 3).publishOn(Schedulers.elastic())) .concatMap(i -> Flux.range(0, i).publishOn(Schedulers.elastic())) .subscribe(log::info); 之后添加doOnNext

just

然后我可以同时获得debug和info的输出。我可以知道为什么吗?

编辑1: 以下流的控制台输出:

Flux.just(1, 2, 3).doOnNext(log::debug).publishOn(Schedulers.elastic()))
    .concatMap(i -> Flux.range(0, i).publishOn(Schedulers.elastic()))
    .subscribe(log::info);

并输出:

Flux.just(1, 2, 3).doOnNext(log::debug)
    .publishOn(Schedulers.elastic())).doOnNext(log::warn)
    .concatMap(i -> Flux.range(0, i).publishOn(Schedulers.elastic()))
    .subscribe(log::info);

我认为日志消息证明[main] INFO ReactiveTest - 1 [main] INFO ReactiveTest - 2 [elastic-2] WARN ReactiveTest - 1 [main] INFO ReactiveTest - 3 [elastic-2] DEBUG ReactiveTest - 0 [elastic-2] WARN ReactiveTest - 2 [elastic-2] DEBUG ReactiveTest - 0 [elastic-2] DEBUG ReactiveTest - 1 [elastic-2] WARN ReactiveTest - 3 [elastic-2] DEBUG ReactiveTest - 0 [elastic-2] DEBUG ReactiveTest - 1 [elastic-2] DEBUG ReactiveTest - 2 中的函数将与subscribe的函数在同一线程被调用。

1 个答案:

答案 0 :(得分:1)

调用subscribe之后,您的第一个程序可能会终止。来自subscribe的文档:

  

请记住,由于序列可以是异步的,因此它将立即   将控制权返回给调用线程。这可以给消费者留下印象   在主线程或单元测试中执行时不会被调用。

在第二个程序中,doOnNext在处理过程中被调用,因此有时间输出所有结果。如果您多次运行该程序,您会发现它有时无法输出第二个日志。