Flux.create
和Flux.generate
之间有什么区别?我正在寻找 - 理想情况下使用一个示例用例 - 来了解何时应该使用其中一个。
答案 0 :(得分:10)
在Flux::create
执行时,
Flux::generate
不会对应用状态的变化做出反应。
Flux::create
当您想要计算不受应用状态和管道(您的管道)状态影响的多个(0 ...无穷大)值时,您将使用它 ==在 Flux::create
== 下游之后的操作链。
为什么呢?因为您发送到Flux::create
的方法会继续计算元素(或没有)。 下游将确定它想要的元素数量(元素== 下一个信号),如果他无法跟上,那些已经发出的元素将被删除/缓冲在一些策略中(默认情况下,它们将被缓冲,直到下游要求更多)。
第一个也是最简单的用例是用于发出值,理论上,这些值可以汇总到一个集合中,然后只取每个元素并用它做一些事情:
Flux<String> articlesFlux = Flux.create((FluxSink<String> sink) -> {
/* get all the latest article from a server and
emit them one by one to downstream. */
List<String> articals = getArticalsFromServer();
articals.forEach(sink::next);
});
如您所见,Flux.create
用于阻塞方法(getArticalsFromServer
)与异步代码之间的交互。
我确定Flux.create
还有其他用例。
Flux::generate
Flux.generate((SynchronousSink<Integer> synchronousSink) -> {
synchronousSink.next(1);
})
.doOnNext(number -> System.out.println(number))
.doOnNext(number -> System.out.println(number + 4))
.subscribe();
输出将为1 5 1 5 1 5................forever
在您发送给Flux::generate
的方法的每次调用中,synchronousSink
只能发出:onSubscribe onNext? (onError | onComplete)?
。
这意味着Flux::generate
将计算并发出值按需。你应该什么时候使用它?如果计算可能未使用 downstream 的元素太昂贵,或者您发出的事件受应用程序状态或管道状态的影响(您的管道 ==在 Flux::create
== 下游之后来的操作链。)
例如,如果您正在构建torrent应用程序,那么您将实时接收数据块。您可以使用Flux::generate
将任务(要下载的块)分配给多个线程,只有当某个线程询问时,您才会计算要在Flux::generate
内部下载的块。所以你只会发出你没有的块。使用Flux::create
的相同算法将失败,因为Flux::create
将发出我们没有的所有块,如果某些块无法下载,那么我们就会遇到问题。因为Flux::create
在Flux::generate
执行时View
对应用状态的变化没有反应。
答案 1 :(得分:2)
创建
Consumer<FluxSink<T>>
生成:
Consumer<SynchronousSink<T>>
选中此blog以获得更多详细信息。