В чем разница между transform
и transformDeferred
в потоке реактора проекта.
Будет полезен хороший пример.
https://projectreactor.io/docs/core/release/reference/index.html#advanced-mutualizing-operator-usage
В чем разница между transform
и transformDeferred
в потоке реактора проекта.
Будет полезен хороший пример.
https://projectreactor.io/docs/core/release/reference/index.html#advanced-mutualizing-operator-usage
В большинстве случаев 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());
И категория журналов будет разной для каждого подписчика.
deferred
. - person Toerktumlare   schedule 02.09.2020