どのように反応器内のflatMap()でコンテキストを使用するには?

ヒューバート:

私が理解し、問題持つコンテキストをドキュメンテーションだからと言っているコンテキストであります:

そのようなコンテキストプロトコルを介して演算子としてコンポーネント間で伝播されるキー/値のストア。コンテキストは、追跡やセキュリティトークンなどの直交情報を搬送するために理想的です。

すごい。

今度は、私たちが使用して何かを伝播したいとしましょうコンテキストをどこにでもそれを持っています。別の非同期コードを呼び出すために、我々は、単に使用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
    }
}

呼ばれる方法があることができ(最も可能性が高くなります)別のクラスに。

事前に助けてくれてありがとう!

編集:質問より簡潔かつポイントにまっすぐにするためにいくつかのコードを削除しました。

Dokukaで:

チェーンあなたPublisherのともContextあなたと一緒に

場合は、すべてのあなたの接続Publisher(これは内の接続が含ま秒flatMap/ concatMapあなたがいるだろうし、同様の演算子を)Context正しくストリーム全体のランタイム間で伝播します。

アクセスするにはContextnameToGreeting方法、あなたは呼び出すことができ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のために、ルックオーバーライド我々が表示され、その用途の親の親が原子炉を持っているならば手段、このコンテキストは各内部に伝播されます- currentContextFlatMapInnerContextContextPublisher

したがって、で返されるnameToGreeting方法はMono同じになりますContext親としての

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=202507&siteId=1