reactor 3.4.2 提供的新的context传递的方法介绍
contextWrite 方法提供需要传递的context
deferContextual和transformDeferredContextual读取context中的值
String key = "key";
Mono.just("anything")
.flatMap(s -> Mono.deferContextual(ctx ->
Mono.just(s + " " + ctx.get(key)))) // <1>
.publishOn(Schedulers.newSingle("a")) // <3>
.transformDeferredContextual( // <2>
(mono, context) -> {
return mono.map(d -> d + " 0000 " + context.get(key));
}
)
.map(a -> a.toUpperCase(Locale.ROOT))
.log()
.contextWrite(Context.of(key, "myValue")) // <5>
.subscribeOn(Schedulers.newSingle("b")) // <4>
.subscribe(System.out::println);
10:33:41.014 [b-1] INFO reactor.Mono.Map.1 - onSubscribe(FluxMap.MapConditionalSubscriber)
10:33:41.016 [b-1] INFO reactor.Mono.Map.1 - request(unbounded)
10:33:41.018 [a-2] INFO reactor.Mono.Map.1 - onNext(ANYTHING MYVALUE 0000 MYVALUE)
ANYTHING MYVALUE 0000 MYVALUE
10:33:41.018 [a-2] INFO reactor.Mono.Map.1 - onComplete()
关于 reactor中context的传递为了解决threadLocal在异步或者reactor环境失效的问题
- deferContextual方法是在整个链的开始使用context
- transformDeferredContextual是在整个链的中间使用context
- publishOn 切换换线程,从log可知
- subscribeOn 从onSubscribe切换线程
- contextWrite 提供需要传递的context
整个context在不同的线程中传递
参考
- github.com/reactor/rea…
- projectreactor.io/docs/core/r…
- domenicosibilio.medium.com/the-good-th… 方法传值
- bsideup.github.io/posts/daily… 自定义operator导致context丢失