问题描述
项目反应堆流量中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”);`
现在,您可以通过transform
在服务的所有返回通量的方法中应用此特征。
立即在组装时应用它。由于订阅者紧随其后,他们都“共享”了该功能的相同结果。
现在假设您希望将日志记录到例如。包括订阅时间或其他更依赖于每个单独订阅者的数据。
这是transformDeferred
出现的地方:它将Function
的应用推迟到发生订阅的那一刻。另外,它将Function
应用于每次订阅。
因此您可以执行以下操作:
loggingTrait = f -> f.log(serviceName + "@" + System.currentTimeMillis());
每个用户的日志类别都不同。