链接您的Publishers,让Context 与您同在
在这种情况下,您连接了所有Publishers(这包括flatMap/concatMap 和类似运算符中的连接)您将在整个流运行时中正确传播Context。
要在nameToGreeting 方法中访问Context,如果方法似乎不相关,您可以调用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 的上下文中被调用。在后台 -> (Here Some FluxFlatMap internals),每个映射的 Publisher 都由 FlatMapInner 订阅。如果我们查看FlatMapInner 并寻找the currentContext override,我们将看到FlatMapInner 使用父Context,这意味着如果父有一个反应器Context - 那么这个上下文将被传播到每个内部@ 987654345@.
因此,nameToGreeting 方法返回的 Mono 将具有与其父级相同的 Context