project reactor context 3.4.x

1,724 阅读1分钟

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环境失效的问题

  1. deferContextual方法是在整个链的开始使用context
  2. transformDeferredContextual是在整个链的中间使用context
  3. publishOn 切换换线程,从log可知
  4. subscribeOn 从onSubscribe切换线程
  5. contextWrite 提供需要传递的context

整个context在不同的线程中传递

参考