为什么日志方法的位置在项目反应器中无关紧要

why log method's position doesn't matter in project reactor

我有以下代码,其中 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() 方法文档说 观察所有 Reactive Streams 信号 。这到底是什么意思,为什么 log() 方法调用不影响日志输出?

如其所说 Observe all Reactive Streams signals.

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

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

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

在高层次上,您可以说当 Mono 获得其值时,它将发出信号 next,然后这将告诉 map 调用 Mono 调用 onNext

所以操作员们在互相交谈 所以步骤例如:

  • 价值落在单声道
  • 单声道信号 next 并提供值
  • map 然后调用 onNext 到 运行 它根据 Mono
  • 提供的值的逻辑

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

当你声明类似

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

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