私が理解し、問題持つコンテキストを。ドキュメンテーションだからと言っているコンテキストであります:
そのようなコンテキストプロトコルを介して演算子としてコンポーネント間で伝播されるキー/値のストア。コンテキストは、追跡やセキュリティトークンなどの直交情報を搬送するために理想的です。
すごい。
今度は、私たちが使用して何かを伝播したいとしましょうコンテキストをどこにでもそれを持っています。別の非同期コードを呼び出すために、我々は、単に使用flatMap()メソッドを。
問題:どのように呼び出されるメソッド内でアクセスコンテキストに?
サンプル(簡単な)コード:
public class TestFlatMap {
public static void main(final String ...args) {
final Flux<String> greetings = Flux.just("Hubert", "Sharon")
.flatMap(TestFlatMap::nameToGreeting)
.subscriberContext(context ->
Context.of("greetingWord", "Hello") // context initialized
);
greetings.subscribe(System.out::println);
}
private static Mono<String> nameToGreeting(final String name) {
return Mono.just("Hello " + name + " !!!"); // ALERT: we don't have Context here
}
}
呼ばれる方法があることができ(最も可能性が高くなります)別のクラスに。
事前に助けてくれてありがとう!
編集:質問より簡潔かつポイントにまっすぐにするためにいくつかのコードを削除しました。
チェーンあなたPublisher
のともContext
あなたと一緒に
場合は、すべてのあなたの接続Publisher
(これは内の接続が含ま秒flatMap
/ concatMap
あなたがいるだろうし、同様の演算子を)Context
正しくストリーム全体のランタイム間で伝播します。
アクセスするにはContext
でnameToGreeting
方法、あなたは呼び出すことができMono.subscribeContext
、方法が関連していないと思われた場合に保存された情報のイベントを取得します。以下に示し上述した概念:
public class TestFlatMap {
public static void main(final String ...args) {
final Flux<String> greetings = Flux.just("Hubert", "Sharon")
.flatMap(TestFlatMap::nameToGreeting)
.subscriberContext(context ->
Context.of("greetingWord", "Hello") // context initialized
);
greetings.subscribe(System.out::println);
}
private static Mono<String> nameToGreeting(final String name) {
return Mono.subscriberContext()
.filter(c -> c.hasKey("greetingWord"))
.map(c -> c.get("greetingWord"))
.flatMap(greetingWord -> Mono.just(greetingWord + " " + name + " " + "!!!"));// ALERT: we have Context here !!!
}
}
また、あなたが使用して、次のように同じことを行うことができzip
、後で結果を結合するために、演算子を:
public class TestFlatMap {
public static void main(final String ...args) {
final Flux<String> greetings = Flux.just("Hubert", "Sharon")
.flatMap(TestFlatMap::nameToGreeting)
.subscriberContext(context ->
Context.of("greetingWord", "Hello") // context initialized
);
greetings.subscribe(System.out::println);
}
private static Mono<String> nameToGreeting(final String name) {
return Mono.zip(
Mono.subscriberContext()
.filter(c -> c.hasKey("greetingWord"))
.map(c -> c.get("greetingWord")), // ALERT: we have Context here !!!
Mono.just(name),
(greetingWord, receivedName) -> greetingWord + " " + receivedName + " " + "!!!"
);
}
}
だから、なぜそれが動作しますか?
我々は上記のサンプルからもわかるように、nameToGreeting
メインのコンテキスト内で呼ばれていますFlux
。ボンネットの下- > (ここではいくつかのFluxFlatMap内部)、各マッピングさPublisher
によってサブスクライブされていますFlatMapInner
。我々は見ている場合FlatMapInner
のために、ルックオーバーライド我々が表示され、その用途の親の親が原子炉を持っているならば手段、このコンテキストは各内部に伝播されます- 。currentContext
FlatMapInner
Context
Context
Publisher
したがって、で返されるnameToGreeting
方法はMono
同じになりますContext
親としての