Registrando uma sequência reativa
1. Visão geral
Com a introdução deSpring WebFlux, obtivemos outra ferramenta poderosa para escrever aplicativos reativos e sem bloqueio. Embora usar essa tecnologia agora seja muito mais fácil do que antes,debugging reactive sequences in Spring WebFlux can be quite cumbersome.
Neste tutorial rápido, veremos como registrar facilmente eventos em sequências assíncronas e como evitar alguns erros simples.
2. Dependência do Maven
Vamos adicionar a dependência Spring WebFlux ao nosso projeto para que possamos criar fluxos reativos:
org.springframework.boot
spring-boot-starter-webflux
Podemos obter a dependênciaspring-boot-starter-webflux mais recente do Maven Central.
3. Criação de um fluxo reativo
Para começar, vamos criar um fluxo reativo usandoFluxe usar o métodolog() para habilitar o registro:
Flux reactiveStream = Flux.range(1, 5).log();
Em seguida, assinaremos para consumir os valores gerados:
reactiveStream.subscribe();
4. Fluxo reativo de registro
Depois de executar o aplicativo acima, vemos nosso logger em ação:
2018-11-11 22:37:04 INFO | onSubscribe([Synchronous Fuseable] FluxRange.RangeSubscription)
2018-11-11 22:37:04 INFO | request(unbounded)
2018-11-11 22:37:04 INFO | onNext(1)
2018-11-11 22:37:04 INFO | onNext(2)
2018-11-11 22:37:04 INFO | onNext(3)
2018-11-11 22:37:04 INFO | onNext(4)
2018-11-11 22:37:04 INFO | onNext(5)
2018-11-11 22:37:04 INFO | onComplete()
Vemos todos os eventos que ocorreram em nosso stream. Cinco valores foram emitidos e o fluxo fechado com um eventoonComplete().
5. Cenário de registro avançado
Podemos modificar nosso aplicativo para ver um cenário mais interessante. Vamos adicionartake() aFlux, que instruirá o stream a fornecer apenas um número específico de eventos:
Flux reactiveStream = Flux.range(1, 5).log().take(3);
Depois de executar o código, veremos a seguinte saída:
2018-11-11 22:45:35 INFO | onSubscribe([Synchronous Fuseable] FluxRange.RangeSubscription)
2018-11-11 22:45:35 INFO | request(unbounded)
2018-11-11 22:45:35 INFO | onNext(1)
2018-11-11 22:45:35 INFO | onNext(2)
2018-11-11 22:45:35 INFO | onNext(3)
2018-11-11 22:45:35 INFO | cancel()
Como podemos ver,take() causou o cancelamento do fluxo após a emissão de três eventos.
The placement of log() in your stream is crucial. Vamos ver como colocarlog() depois detake() produzirá uma saída diferente:
Flux reactiveStream = Flux.range(1, 5).take(3).log();
E a saída:
2018-11-11 22:49:23 INFO | onSubscribe([Fuseable] FluxTake.TakeFuseableSubscriber)
2018-11-11 22:49:23 INFO | request(unbounded)
2018-11-11 22:49:23 INFO | onNext(1)
2018-11-11 22:49:23 INFO | onNext(2)
2018-11-11 22:49:23 INFO | onNext(3)
2018-11-11 22:49:23 INFO | onComplete()
Como podemos ver, a mudança do ponto de observação mudou a saída. Agora, o fluxo produziu três eventos, mas em vez decancel(),, vemosonComplete(). This is because we observe the output of using take() instead of what was requested by this method.
6. Conclusão
Neste artigo rápido, vimos como registrar fluxos reativos usando o métodolog() integrado.
E como sempre, o código-fonte para o exemplo acima pode ser encontradoover on GitHub.