web-dev-qa-db-ja.com

あるフラックス/モノから別のフラックス/モノにコンテキストを渡す

興味深いことがwebfluxパッケージ内で発生します。しかし、ソースでの私の旅は、次の質問を解決しませんでした。

私が次のモノラル(またはフラックス)を持っているとしましょう:

Mono hello = Mono.empty()
            .subscriberContext(ctx -> ctx.put("message", "hello"));

Webフィルター内で同様の構成を使用して、パイプラインをテナントおよびユーザーデータで強化します。次に、コントローラーで次のような構成が使用されます。

Mono world = Mono.subscriberContext()
            .map(ctx -> (String)ctx.get("message"));

こんにちはモノのコンテキストは、世界のモノで満たされています。ユニットテストの目的でも、これがどのように行われるかを理解しようとしました。

結局、それは謎のままです。モノラル/フラックスオブジェクトの両方で利用可能な通常のメソッドでこれを実行しようとしましたが、helloコンテキストをワールドモノラルで利用できるようにすることに成功しませんでした。フラックスとモノを融合し、途中でコンテキストを上流のオペレーターに渡すにはどうすればよいですか?

5
Gie Spaepen

WebFluxはworldMonoを受け取り、その上にリアクティブチェーンを構築し、最終的なソースとしてreactor-netty内のHTTPリクエストを使用します。 WebFilterはチェーン構築の一部であるため、チェーン全体のContextを充実させることができます。

IIRC Mono.subscriberContext()flatMap内で使用され、メインシーケンスContextを内部で使用できるようにするため、Contexthelloを確認できます。

2
Simon Baslé

あなたはいくつかのことをしたい:

1.)サブスクライバーコンテキストを公開する

mono.subscriberContext({ Context context ->
    context.put("key", "value")
})

2.)サブスクライバーコンテキストにサブスクライブ/アクセスする

mono.flatMap({ def r ->
    return Mono.subscriberContext().map({ Context context ->
        context.get("key")
        context.get("keyOrMapOrStateObject").put("someKey", "someData")
        return r
    })
})

3.)1つのイベントからダウンストリームイベントにデータを渡す可能性がある

mono.flatMap({ def r ->
    return Mono.subscriberContext().map({ Context context ->
        def someData = context.get("keyOrMapOrStateObject").get("someKey")
        return r
    })
})

全体として、次のようになります:(これはグルーヴィーな構文です)

mono.flatMap({ def r ->
    return Mono.subscriberContext().map({ Context context ->
        context.get("key")
        context.get("keyOrMapOrStateObject").put("someKey", "someData")
        return r
    })
}).flatMap({ def r ->
    return Mono.subscriberContext().map({ Context context ->
        def someData = context.get("keyOrMapOrStateObject").get("someKey")
        return r
    })
}).subscriberContext({ Context context ->
    context.put("key", "value")
    context.put("keyOrMapOrStateObject", new HashMap())
})

これは大まかな概要です。「現状のまま」では準備ができていませんが、パターンを理解するのに役立つはずです。

幸運を!

1
Bas Kuis