Реактор: обнаружение пустого сигнала, чтобы иметь возможность действовать на пустой моно

Есть оператор или какой-то хороший подход для достижения поведения doOnEmpty() с Project Reactor Mono?

Я хочу иметь побочные эффекты (логирование) для результата операции.

Вот что у меня сейчас:

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

Таким образом, я обертываю фактическое значение или в случае пустого создания пустой оболочки. Затем оболочка потребляется для побочных эффектов.

Вместо этого было бы неплохо использовать что-то вроде doOnEmpty(Consumer> signalConsumer). Чтобы усложнить ситуацию, мне нужен доступ к Сигналу, чтобы получить доступ к Контексту (содержит данные, необходимые для регистрации).

Есть эти ответы, но я не думаю, что они применяются или предоставляют доступ к контексту.

Итак, теперь, когда я думаю об этом, возможно, правильный вопрос:

"Есть ли способ определить на DoOnEach(Consumer Signal), если наблюдаемое разрешено пустым?"

0 ответов

Некоторые примеры реализации "Пустой уловки" без побочного эффекта.

  • doOnSuccess - вызывается с результатом, допускающим значение NULL
       Mono.empty()
    .doOnSuccess(result -> {
        if (result == null) {
            // This is an empty result
            Logger.info(this.getClass(), "result = {}", result);
        }
    })
    .subscribe();
  • 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();
Другие вопросы по тегам