Webflow:从流中对象添加订阅者上下文值 [英] Webflux: Add Subscriber Context Values from In-Stream Objects

查看:16
本文介绍了Webflow:从流中对象添加订阅者上下文值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Webflow应用程序,我使用订阅者上下文来填充MDC值,以便它们可以向下传播。我已经实现了this project中的类来处理订阅者之间的MDC传输,设置了一个WebFilter来将请求ID添加到传入请求中,并且可以在日志中看到作为MDC的一部分的请求ID。

public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    return chain.filter(exchange)
            .contextWrite(Context.of("requestId", UUID.randomUUID().toString()));
}

日志输出:

2021-09-30 17:15:29,963 [reactor-tcp-nio-2] INFO  c.p.l.s.RepoService:33 - MDC[requestId=ec0b68cf-ba4d-4c7f-afa4-f67fc97ebcbf] - Found user

请求需要从数据库中提取用户记录,提取数据后,我需要将用户ID和电子邮件添加到上下文,但我不知道如何从流中的对象将值添加到上下文。

所以我试着这样做:

public Mono<Response> doProcessing(String userId, Object object) {
    return userRepo.findUserById(userId) //Returns UserEntity object
            .flatMap(userEntity -> service.doMoreProcessing(userEntity, object))
            .contextWrite(Context.of("userId", userId, "email", userEntity.getEmail()));
}

问题是,当我调用contextWrite()时,无法访问userEntity对象,因此无法使用该调用将用户的电子邮件添加到上下文中。

我已尝试使用Mono.deferredContextual()...

public Mono<Response> doProcessing(String userId, Object object) {
    return userRepo.findUserById(userId) //Returns UserEntity object
            .flatMap(userEntity -> Mono.deferContextual(ctx -> Mono.just(userEntity).contextWrite(Context.of(ctx).putAll(Context.of("userId", userId, "email", userEntity.getEmail()).readOnly()))))
            .flatMap(userEntity -> service.doMoreProcessing(userEntity, object));
}

...和.transformDeferredContextual()...

public Mono<Response> doProcessing(String userId, Object object) {
    return userRepo.findUserById(userId) //Returns UserEntity object
            .transformDeferredContextual((userEntityMono, contextView) -> userEntityMono.flatMap(userEntity -> Mono.just(userEntity).contextWrite(Context.of(contextView).putAll(Context.of("userId", userId, "email", userEntity.getEmail()).readOnly()))))
            .flatMap(userEntity -> service.doMoreProcessing(userEntity, object));
}

...但一切都没有奏效。如何将数据从属于流程流一部分的对象添加到订阅方上下文?

推荐答案

您可以尝试这样的操作

public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        return chain.filter(exchange)
                .contextWrite(Context.of("your-key", new HashMap<String, Object>()));
}

public Mono<Response> doProcessing(String userId, Object object) {
    return userRepo.findUserById(userId)
            .doOnEach(signal -> {
                if (!signal.isOnNext()) return;
                Optional<Map<String, Object>> optional = signal.getContextView().getOrEmpty("your-key");
                optional.ifPresent(map -> {
                    map.put("userId", signal.get().getId());
                    map.put("email", signal.get().getEmail());
                });
            });
}

这篇关于Webflow:从流中对象添加订阅者上下文值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆