преобразовать против преобразования

В чем разница между transform и transformDeferred в потоке реактора проекта.

Будет полезен хороший пример.

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


person Andrew Sasha    schedule 02.09.2020    source источник
comment
читайте о горячих и холодных издателях projectreactor.io/docs/core/ release / reference / вы переключаетесь между ними с помощью ключевого слова deferred.   -  person Toerktumlare    schedule 02.09.2020


Ответы (1)


В большинстве случаев Flux ленив: вы объявляете конвейер обработки, но данные начинают поступать только после того, как вы подписались на него. Вы можете подписаться несколько раз.

Это называется холодным Flux (и каждый раз, когда вы подписываетесь на холодный источник, источник заново генерирует свои данные для нового подписчика).

Итак, мы можем выделить:

  • время сборки: момент, когда мы вызываем операторы в Flux экземпляре, возвращая новый Flux экземпляр.
  • время подписки: момент, на который подписан этот экземпляр. Собственно, моменты (множественное число), поскольку может быть несколько подписок, которые могут быть далеко друг от друга.

transform - это удобный метод применения набора операторов к заданному Flux. Например, вы хотите, чтобы все ваши Flux, возвращаемые методами службы, использовали .log("serviceName"), поэтому вы реализуете эту черту в static Function<Flux, Flux>:

loggingTrait = f - ›f.log (serviceName);`

Теперь вы можете применить эту черту во всех методах службы, возвращающих Flux, через transform.

Применяется сразу, прямо во время сборки. Поскольку подписчики приходят после, все они имеют один и тот же результат функции.

Теперь представьте, что вы хотите, чтобы журнал, например. включать время подписки или другую часть данных, которая больше зависит от каждого отдельного подписчика.

Вот где приходит transformDeferred: он откладывает применение Function до момента, когда происходит подписка. Кроме того, он применяет Function для КАЖДОЙ подписки.

Итак, вы можете сделать что-то вроде:

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

И категория журналов будет разной для каждого подписчика.

person Simon Baslé    schedule 10.09.2020