【问题标题】:what happen if a flux/mono/Observable never be subscribed如果 Flux/mono/Observable 从未被订阅会发生什么
【发布时间】:2019-10-04 13:32:38
【问题描述】:
public void test(){
Mono<String> mono = Mono.just("aaa")
FLux<String> flux = Flux.fromArray()
Observable<String> observable = Observable.from(...)
}
发生了什么测试方法已执行?
- 这三个对象都将被 GC 收集?
- 如果有操作,就永远不会执行?
- 如果上面的问题是否定的,会发生什么?
【问题讨论】:
标签:
rx-java2
spring-webflux
【解决方案1】:
为了更好地理解 Flux 和 Mono 的工作原理,您可以将它们想象成管道。当您编写代码时-您不是对数据进行操作,而是仅描述管道完成时数据应该发生的情况。要使管道完整 - 您需要订阅它(这是管道的末端)。
例如这段代码:
Mono sampleMono = Mono.just(1)
.map(Integer::toString)
.doOnNext(System.out::println)
在这段代码中,你只会告诉当有人订阅sampleMono 时应该做什么。当有人这样做时 - 然后1 将被发出,映射到字符串并打印到控制台。但它只会在订阅后发生。
这有点像输水管道 - 您可以从井中取冷水并安装热水器。但是,在您使用淋浴或水槽之前,您会得到温水(您需要订阅温水:))。
Mono 和 Flux 是惰性的 - 所以它只会在有人订阅时发出。当然 - 所有代码行都已执行,但它们负责创建“管道”,并且在您订阅之前 - 它们仍然未使用。但也许带有优化器的 java 会做这件事,这些行将从机器代码中完全删除。