web-dev-qa-db-ja.com

Spring 5 WebFlux MonoおよびFlux

Spring 5では、Spring WebFluxハンドラーメソッドがリクエストを処理し、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. MonoおよびFluxの意味.

2. WebFlux Handlerとの連携方法。

前もって感謝します。

8
Shalika

Webfluxはすべて、リアクティブプログラミングに関するものです。つまり、ビジネスロジックは、処理するデータが利用可能(リアクティブ)になって初めて実行されます。

これは、単純なPOJOを返すことができなくなったことを意味しますが、利用可能なときに結果を提供できる何か他のものを返す必要があります。 反応ストリーム イニシアチブ内では、これは Publisher と呼ばれます。 Publisherにはsubcribe()メソッドがあり、利用可能な場合にコンシューマーがPOJOを取得できます。

Publisher(たとえばPublisher<Foo>)は、ゼロまたは複数の、場合によっては無限の結果を返すことができます。予想できる結果の数をより明確にするために、 Project Reactor (Pivotalのリアクティブストリーム実装)はPublisherの2つの実装を導入しました:

  • 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であるため、1つずつ放出されることを理解する必要があります。他の場合では、数値は外部APIから取得される可能性があり、その場合、それらはすぐには利用できません。次のフェーズ(map演算子)では、1を取得するとすぐに数値が乗算されます。つまり、このマッピングも1つずつ実行され、新しい値が出力されます。

最終的には、サブスクライバーが存在し(常に1つ存在する必要がありますが、サブスクライブしているのはSpringフレームワーク自体である可能性があります)、この場合、取得した各値を出力し、1つずつコンソールに出力します。

また、これらのアイテムを処理するときに特定の順序はないことを理解する必要があります。最初の数値はすでにコンソールに印刷されているのに、3番目の項目はまだ2倍されていない可能性があります。

したがって、あなたの場合、Mono<ServerResponse>があります。これは、ServerResponseが利用可能になるとすぐに、WebFluxフレームワークがそれを利用できることを意味します。期待されるServerResponseは1つだけなので、MonoではなくFluxです。

20
g00glen00b