【问题标题】:why log method's position doesn't matter in project reactor为什么 log 方法的位置在项目反应堆中无关紧要
【发布时间】:2021-07-16 10:03:59
【问题描述】:

我有以下代码,其中log() 方法在两个不同的地方被调用。但在这两种情况下,生成的日志输出是相同的。

Mono mono1 = Mono.just("vashishth").log().map( s -> s.toUpperCase(Locale.ROOT));
mono1.subscribe(name -> log.info(name.toString()));

Mono mono2 = Mono.just("vashishth").map(s -> s.toUpperCase(Locale.ROOT)).log();
mono2.subscribe(name -> log.info(name.toString()));

log() 方法文档说观察所有反应流信号。究竟是什么意思,为什么 log() 方法调用不会影响日志输出?

【问题讨论】:

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


    【解决方案1】:

    正如它所说的Observe all Reactive Streams signals

    所以是的,这到底是什么意思。要知道我们需要知道反应链是如何工作的。

    log不是您所期望的,它不是链中特定部分的System.out.prinlnlog 语句的放置位置实际上并不重要。

    那么什么是signal。好吧,一旦您使用Mono,您基本上就是在告诉whenever i have a value in this mono please call the next operator in the chain(在您的情况下,下一个运算符是map)。那么我们如何知道我们在Mono 中有一个值呢?嗯,就是这样。当有值时,单声道将发出信号

    在高层次上,你可以说当Mono 获得它的值时,它会发出next 的信号,然后这会告诉mapMono 调用Mono 调用onNext

    所以运营商是在互相交谈 所以步骤例如:

    • 价值在一个单一的土地上
    • 单声道信号next 并提供值
    • map 然后调用 onNext 以在 Mono 提供的值上运行其逻辑

    这就是所谓的反应链,因为每一步都与下一步对话。当您添加log 语句时,您可以看到不同操作员之间的所有这些对话。正如文档所说,您可以看到所有对话,因此无论您将它放在哪里,您都会看到从第一个操作员到最后一个操作员的所有对话。 p>

    当你声明类似的东西时

    Mono.just("foobar").map(s -> s.toUppercase()).subscribe(System::out::println);
    

    你没有声明信号。它在您不知情的情况下发生在“引擎盖下”。但是当您将log 添加到链中时,您会在日志中看到它。

    【讨论】:

    • 我可能让它看起来很复杂。但是在下面的代码中,什么是流,什么是信号? Mono.just("vashishth").log().map(s -> s.toUpperCase(Locale.ROOT));
    • 我更新了我的答案,你没有声明任何信号,它在引擎盖下自动发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2017-06-30
    • 2021-05-30
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多