You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:52:19