Webflux - это все о реактивном программировании, что в итоге означает, что бизнес-логика выполняется только тогда, когда данные для обработки становятся доступными (реактивными).
Это означает, что вы больше не можете возвращать простые POJO, но вы должны возвращать что-то еще, что может обеспечить результат, когда он станет доступен. В рамках инициативы реактивные потоки это называется Publisher
. У Publisher
есть метод subcribe()
, который позволит потребителю получить POJO, когда он станет доступен.
A Publisher
(например, Publisher<Foo>
) может возвращать ноль или несколько, возможно, бесконечных, результатов. Чтобы было яснее, сколько результатов вы можете ожидать, Project Reactor (реализация реактивных потоков в Pivotal) представила две реализации Publisher
:
- A
Mono
, который завершится после выдачи одного результата.
- A
Flux
, который выдаст ноль или кратные, возможно бесконечные результаты и затем завершится.
Итак, в основном вы можете видеть Mono<Foo>
как реактивный аналог возврата Foo
и Flux<Foo>
как реактивный аналог Collection<Foo>
.
Например:
Flux
.just(1, 2, 3, 4)
.map(nr -> nr * 2)
.subscribe(System.out::println);
Даже если числа уже доступны (вы можете их видеть), вы должны понимать, что, поскольку это Flux
, они испускаются один за другим. В других случаях числа могут поступать из внешнего API, и в этом случае они не будут сразу доступны.
Следующая фаза (оператор map
) будет умножать число, как только он его получит, это означает, что он также выполняет это отображение одно за другим, а затем испускает новое значение.
В конце концов, есть подписчик (всегда должен быть один, но он может быть подписан самой платформой Spring), и в этом случае он будет печатать каждое полученное значение и выводить его на консоль, также, один за другим. .
Вы также должны понимать, что при обработке этих предметов нет особого порядка. Возможно, первое число уже напечатано на консоли, а третье еще не умножено на два.
Итак, в вашем случае у вас есть Mono<ServerResponse>
, что означает, что как только ServerResponse
станет доступным, инфраструктура WebFlux сможет его использовать. Поскольку ожидается только один ServerResponse
, это Mono
, а не Flux
.