変換とtransformDeferred

Sep 03 2020

違いは何ですかtransform&transformDeferredプロジェクトの原子炉のフラックスでは。

良い例が役に立ちます。

https://projectreactor.io/docs/core/release/reference/index.html#advanced-mutualizing-operator-usage

回答

3 SimonBaslé Sep 10 2020 at 17:34

ほとんどの場合、aFluxは「レイジー」です。処理パイプラインを宣言しますが、データはサブスクライブして初めて流れ始めます。複数回購読できます。

これはコールド と呼ばれ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());

また、ログのカテゴリはサブスクライバーごとに異なります。