web-dev-qa-db-fra.com

Spring 5 WebFlux Mono et Flux

Dans Spring 5, je sais juste que la méthode Spring WebFlux Handler gère la demande et renvoie Mono ou Flux en réponse.

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

Mais je n'ai aucune idée de ce que signifie Mono et Flux et comment cela fonctionne avec le gestionnaire WebFlux.

Quelqu'un peut-il simplement expliquer

1.Que signifie Mono et Flux.

2.Comment cela fonctionne avec le WebFlux Handler.

Merci d'avance.

8
Shalika

Webflux est tout au sujet de la programmation réactive, ce qui signifie en résumé que la logique métier n'est exécutée que lorsque les données à traiter sont disponibles (réactif).

Cela signifie que vous ne pouvez plus renvoyer de POJO simples, mais vous devez renvoyer autre chose, quelque chose qui peut fournir le résultat lorsqu'il est disponible. Dans le cadre de l'initiative flux réactifs , cela s'appelle Publisher . Un Publisher a une méthode subcribe() qui permettra au consommateur d'obtenir le POJO lorsqu'il sera disponible.

A Publisher (par exemple Publisher<Foo>) peut renvoyer zéro ou plusieurs résultats, éventuellement infinis. Pour rendre plus clair le nombre de résultats que vous pouvez attendre, Project Reactor (l'implémentation des flux réactifs de Pivotal) a introduit deux implémentations de Publisher:

  • A Mono , qui se terminera après avoir émis un seul résultat.
  • Un Flux , qui émettra zéro ou plusieurs résultats, éventuellement infinis, puis se terminera.

Donc, en gros, vous pouvez voir Mono<Foo> comme contrepartie réactive du renvoi de Foo et Flux<Foo> comme contrepartie réactive de Collection<Foo>.

Par exemple:

Flux
    .just(1, 2, 3, 4)
    .map(nr -> nr * 2)
    .subscribe(System.out::println);

Même si les numéros sont déjà disponibles (vous pouvez les voir), sachez que puisque c'est un Flux, ils sont émis un par un. Dans d'autres cas, les chiffres peuvent provenir d'une API externe et dans ce cas, ils ne seront pas immédiatement disponibles. La phase suivante (l'opérateur map), multipliera le nombre dès qu'il en récupérera un, cela signifie qu'il effectue également ce mappage un par un puis émet la nouvelle valeur.

Finalement, il y a un abonné (il devrait toujours y en avoir un, mais ce pourrait être le framework Spring lui-même qui s'abonne), et dans ce cas, il imprimera chaque valeur qu'il obtient et l'imprimera également sur la console, une par une.

Vous devez également réaliser qu'il n'y a pas d'ordre particulier lors du traitement de ces articles. Il se peut que le premier nombre ait déjà été imprimé sur la console, tandis que le troisième élément n'a pas encore été multiplié par deux.

Donc, dans votre cas, vous avez un Mono<ServerResponse>, ce qui signifie que dès que le ServerResponse est disponible, le framework WebFlux peut l'utiliser. Puisqu'il n'y a qu'un ServerResponse attendu, c'est un Mono et non un Flux.

20
g00glen00b