Webflux:如何从流内对象向订阅者上下文添加值
Webflux流内动态添加上下文的解决方案
核心原因
你之前的写法未生效是因为Reactor的订阅者上下文是订阅时自底向上传播的:contextWrite() 只会影响其上游算子的上下文读取,下游算子无法获取到该调用新增的上下文属性。你之前的写法要么是把contextWrite放在了需要读取属性的逻辑下游,要么是仅给无业务逻辑的Mono.just添加了上下文,业务处理逻辑所在的流根本读取不到新增的userId和email。
正确实现方式
你只需要在flatMap拿到userEntity之后,将后续需要读取新上下文的业务逻辑(也就是service.doMoreProcessing)包裹在内部流中,在这个内部流的下游调用contextWrite即可:
public Mono<Response> doProcessing(String userId, Object object) { return userRepo.findUserById(userId) .flatMap(userEntity -> // 后续需要用到新上下文的逻辑都放在该内部流中 service.doMoreProcessing(userEntity, object) // 给内部流添加上下文,内部所有算子均可读取到新增属性 .contextWrite(ctx -> ctx.putAll(Map.of( "userId", userId, "email", userEntity.getEmail() ))) ); }
上述写法中,contextWrite作用于doMoreProcessing所在的内部流的下游,内部流订阅时新增的属性会向上传播,doMoreProcessing内的所有逻辑都可以正常读取到userId和email,也会被你配置的MDC上下文传播逻辑正常捕获。
补充说明
该逻辑和你现有WebFilter的实现逻辑是一致的:WebFilter中你将contextWrite放在chain.filter(exchange)的下游,所以整个请求处理链的所有上游算子都可以读取到requestId,符合Reactor上下文的传播规则。
内容的提问来源于stack exchange,提问作者user12387650
相关产品推荐
相关产品推荐

