在响应式编程中,一个线程很可能被用于处理多个异步订阅关系, 同样,一个订阅关系在元素下发的过程中往往可能从一个线程切换到另一个线程。那么上下文变量如何传播呢?
首先来看一个Context的简单用法:
//案例一
String key = "message";
Mono.subscriberContext()
.map( ctx -> "Hello " + ctx.get(key))
.subscriberContext( ctx -> ctx.put(key, "World")) //订阅上下文,核心操作
.subscribe(System.out :: println);
输出结果:
Hello World
源码剖析:
subscriberContext(带参的)操作对应的productor是MonoSubscriberContext,下面来看一下MonoSubscriberContext#subscribeOrReturn(生成Context的地方)
public CoreSubscriber<? super T> subscribeOrReturn(CoreSubscriber<? super T> actual) {
//重点在这里,生成了所需的Context,并保存在消费者ContextStartSubscriber中
Context c = doOnContext.apply(actual.currentContext());
return new FluxContextStart.ContextStartSubscriber<>(actual, c);
}
subscriberCon