Оператор отображения реактивных потоков никогда не выполняется - PullRequest
0 голосов
/ 05 апреля 2020

Для приведенного ниже кода

Mono<String> input = 
        Mono.just("input")
                .map {
                   println "inside map"
                   it + "added"
                 }
                 .transform {
                  Mono.just("hello")
                }

input.subscribe {println it}

Консоль выглядит следующим образом.

16:11:49.056 [main] DEBUG reactor.util.Loggers$LoggerFactory - Using Slf4j logging framework
hello

Код внутри функции map никогда не выполнялся. Я понимаю, что transform метод выполняется в время сборки , а не по подписке.

  • Почему Reactor просто решил не обрабатывать мой восходящий оператор map. Разумно ли он решил, что, поскольку я никоим образом не ссылаюсь на вывод оператора map, ему вообще не нужно выполнять map?
  • Настраивается ли это поведение?

1 Ответ

1 голос
/ 05 апреля 2020

Причина в том, что transform не подписывается автоматически на ваш оригинальный Mono. Вы несете ответственность за то, чтобы связать свою логику c с ней. Поскольку ничто не подписывается на него, оно никогда не сработает.

Поскольку приведенный вами пример - пустышка, трудно сказать, что будет правильным. Это зависит от вашего варианта использования.

Несколько вещей, которые вы можете сделать, однако:

  1. Избавьтесь от преобразования и просто используйте оператор then:
Mono<String> input = 
        Mono.just("input")
                .map {
                   println "inside map"
                   it + "added"
                 }
                 .then(Mono.just("hello"))
Если по какой-то причине вам нужен transform, то связывайте свои логи c с исходным моно:
Mono<String> input = 
        Mono.just("input")
                .map {
                   println "inside map"
                   it + "added"
                 }
                 .transform {
                   it.then(Mono.just("hello"))
                }
...