transform vs transformDeferred

Sep 03 2020

Qual é a diferença entre transforme transformDeferredno fluxo do reator do projeto.

Um bom exemplo será útil.

https://projectreactor.io/docs/core/release/reference/index.html#advanced-mutualizing-operator-usage

Respostas

3 SimonBaslé Sep 10 2020 at 17:34

Na maioria das vezes, a Fluxé "preguiçoso": você declara um pipeline de processamento, mas os dados só começam a fluir depois de assiná -lo. Você pode se inscrever várias vezes.

Isso é chamado de cold Flux (e cada vez que você assina uma fonte cold, a fonte gera seus dados novamente para o benefício do novo assinante).

Portanto, podemos distinguir:

  • tempo de montagem : o momento em que chamamos os operadores de uma Fluxinstância, retornando uma nova Fluxinstância
  • tempo de assinatura : o momento em que essa instância é assinada. Na verdade, os momentos (plural), já que pode haver várias inscrições que podem estar distantes.

transformé um método de conveniência para aplicar um conjunto de operadores a um dado Flux. Por exemplo, você deseja que todos os seus Fluxmétodos retornados por um serviço sejam usados .log("serviceName"), então externaliza essa característica em um static Function<Flux, Flux>:

loggingTrait = f -> f.log ("serviceName"); `

Agora você pode aplicar esta característica em todos os métodos de retorno de fluxo do serviço via transform.

É aplicado imediatamente, logo na hora da montagem. Como os assinantes vêm depois, todos "compartilham" o mesmo resultado da função.

Agora imagine que você gostaria que o registro, por exemplo. incluem o tempo de assinatura ou outro dado que dependa mais de cada assinante individual.

É aí que transformDeferredentra: adia a aplicação do Functionpara o momento em que ocorre a assinatura. Além disso, ele se aplica a FunctionCADA assinatura.

Então você pode fazer algo como:

loggingTrait = f -> f.log(serviceName + "@" + System.currentTimeMillis());

E a categoria de logs seria diferente para cada assinante.