Reactor中contextWrite/deferContextual使用疑问:代码为何报错?
Reactor Context 丢失问题分析与修复
你的问题核心是对Reactor Context的作用范围理解有误。你在flatMap内部的Mono.just(m)上调用contextWrite,这个上下文仅对该内部Mono生效,一旦内部Mono执行完成,上下文不会传递到后续的流操作中——Reactor的上下文是沿订阅链向下传递,无法横向传递到外部流的后续节点。
问题代码的核心问题
第一个flatMap里的contextWrite仅修改了内部子流的上下文,外部主流的上下文始终是初始空状态,因此后续deferContextual调用时会找不到INITIAL键,抛出Context does not contain key: INITIAL异常。
修复方案
方案1:直接在初始流上设置上下文
如果初始值是固定的,可以直接在根节点设置上下文,确保后续所有操作都能继承该上下文:
Mono.just("titi caca") .contextWrite(context -> context.put("INITIAL", "titi caca")) .log() .flatMap(m -> Mono.just(m.toUpperCase())) .log() .flatMap(m -> Mono.<String>deferContextual(contextView -> contextView.get("INITIAL"))) .log() .subscribe();
方案2:动态捕获初始值并传递上下文
如果初始值是动态生成的,需要将后续所有操作嵌套在已设置上下文的流中,确保上下文能贯穿整个订阅链:
Mono.just("titi caca") .flatMap(initial -> Mono.just(initial) .contextWrite(ctx -> ctx.put("INITIAL", initial)) .flatMap(m -> Mono.just(m.toUpperCase())) .flatMap(m -> Mono.<String>deferContextual(ctx -> ctx.get("INITIAL"))) ) .log() .subscribe();
关键原理
Reactor Context与订阅链强绑定,每个contextWrite仅作用于它所修饰的Publisher及其下游订阅节点。若在flatMap的子流中修改上下文,该上下文无法溢出到外部主流,必须确保上下文的修改覆盖到需要使用它的所有后续操作节点。
内容的提问来源于stack exchange,提问作者Yohan al
相关产品推荐
相关产品推荐

