Reactor:检测空信号以便能够作用于空 Mono

Rai*_*ipe 5 java reactor reactive-programming

是否有一个运算符或一些好的方法可以使用 Project Reactor Mono 实现 doOnEmpty() 类型的行为?

我希望对操作结果产生副作用(日志记录)。

这就是我现在所拥有的:

myMono
  .map(value -> new Wrapped(value))
  .defaultIfEmpty(new Wrapped(null))
  .doOnEach( ... )
  .flatMap(wrapped -> 
    wrapped.value == null ? 
      Mono.empty() : Mono.just(wrapped.value))
Run Code Online (Sandbox Code Playgroud)

因此,我正在包装实际值,或者在空的情况下创建空包装器。然后包装纸会因副作用而被消耗。

相反,使用 doOnEmpty(Consumer> signalConsumer) 之类的东西会很好。让事情变得更复杂的是,我需要访问信号才能访问上下文(包含日志记录所需的数据)。

有这些答案,但我认为它们不适用或提供对上下文的访问。

所以现在我想到了这一点,也许正确的问题是:

“有没有办法确定 doOnEach(Consumer Signal ) 是否可观察值解析为空?”

xIs*_*sra 1

一些实现“Empty Catch”且没有副作用的示例。

  • doOnSuccess - 被调用并返回可为空的结果
Mono.empty()
    .doOnSuccess(result -> {
        if (result == null) {
            // This is an empty result
            Logger.info(this.getClass(), "result = {}", result);
        }
    })
    .subscribe();
Run Code Online (Sandbox Code Playgroud)
  • switchIfEmpty + doOnError - 使用抛出和捕获已知异常来跳过管道
Mono.empty()
    .switchIfEmpty(Mono.error(new Exception()))
    .doOnNext(o -> Logger.info(Object.class, "doOnNext"))
    .doOnError(Exception.class, error -> Logger.info(Exception.class, "doOnError"))
    .subscribe();
Run Code Online (Sandbox Code Playgroud)