Spring 5 WebFlux Mono и Flux - PullRequest
       15

Spring 5 WebFlux Mono и Flux

0 голосов
/ 03 июля 2018

В Spring 5 я просто знаю, что метод Spring WebFlux Handler обрабатывает запрос и возвращает Mono или Flux в качестве ответа.

@Component
public class HelloWorldHandler {
    public Mono<ServerResponse> helloWorld(ServerRequest request) {
        return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).body(BodyInserters.fromObject("Hello World"));
    }
}

Но я понятия не имею, что означает Mono и Flux и как он работает с обработчиком WebFlux.

Может ли кто-нибудь просто объяснить

1.Что означает Моно и Флюс .

2.Как это работает с WebFlux Handler .

Заранее спасибо.

1 Ответ

0 голосов
/ 04 июля 2018

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.

...