違いは何ですか - Flux.create
および Flux.generate
?私は、理想的には使用例を使用して、どちらを使用すべきかを理解しています。
_
Flux::create
_はアプリの状態の変化に反応しませんが、_Flux::generate
_は反応します。
Flux::create
_アプリの状態やpipeline(your pipelineの状態に影響されない複数の(0 ...無限大)値を計算する場合に使用します。 = ==続く操作のチェーン後 _Flux::create
_ == 下流)。
どうして? _Flux::create
_に送信したメソッドが要素を計算し続ける(または何もしない)ためです。 downstreamは、必要な要素(elements == next signal)の数を決定し、彼が追い付かない場合は、既に放出されている要素が削除/バッファリングされます。一部の戦略では(デフォルトではdownstreamがさらに要求するまでバッファリングされます)。
最初の最も簡単な使用例は、理論的にはコレクションに合計して、各要素を取得してそれで何かを実行できる値を出力する場合です。
_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または、発生するイベントがアプリの状態またはpipelineの状態に影響される(あなたのパイプライン ==来る操作の連鎖後 _Flux::create
_ == 下流)。
たとえば、トレントアプリケーションを構築している場合は、リアルタイムでデータのブロックを受信しています。 _Flux::generate
_を使用して複数のスレッドにタスク(ダウンロードするブロック)を与え、一部のスレッドが要求した場合にのみ、ダウンロードするブロックを_Flux::generate
_内で計算します。だからあなたは持っていないブロックだけを放出するでしょう。 _Flux::create
_を使用した同じアルゴリズムは失敗します。これは、_Flux::create
_が所有していないすべてのブロックを出力し、一部のブロックがダウンロードに失敗した場合に問題が発生するためです。 _Flux::create
_はアプリの状態の変化に反応しませんが、_Flux::generate
_は反応します。