興味深いことがwebfluxパッケージ内で発生します。しかし、ソースでの私の旅は、次の質問を解決しませんでした。
私が次のモノラル(またはフラックス)を持っているとしましょう:
Mono hello = Mono.empty()
.subscriberContext(ctx -> ctx.put("message", "hello"));
Webフィルター内で同様の構成を使用して、パイプラインをテナントおよびユーザーデータで強化します。次に、コントローラーで次のような構成が使用されます。
Mono world = Mono.subscriberContext()
.map(ctx -> (String)ctx.get("message"));
こんにちはモノのコンテキストは、世界のモノで満たされています。ユニットテストの目的でも、これがどのように行われるかを理解しようとしました。
結局、それは謎のままです。モノラル/フラックスオブジェクトの両方で利用可能な通常のメソッドでこれを実行しようとしましたが、helloコンテキストをワールドモノラルで利用できるようにすることに成功しませんでした。フラックスとモノを融合し、途中でコンテキストを上流のオペレーターに渡すにはどうすればよいですか?
WebFluxはworld
Monoを受け取り、その上にリアクティブチェーンを構築し、最終的なソースとしてreactor-netty内のHTTPリクエストを使用します。 WebFilter
はチェーン構築の一部であるため、チェーン全体のContext
を充実させることができます。
IIRC Mono.subscriberContext()
はflatMap
内で使用され、メインシーケンスContext
を内部で使用できるようにするため、Context
のhello
を確認できます。
あなたはいくつかのことをしたい:
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())
})
これは大まかな概要です。「現状のまま」では準備ができていませんが、パターンを理解するのに役立つはずです。
幸運を!