微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用反应堆上下文获取下层链的结果

如何解决使用反应堆上下文获取下层链的结果

我有这个豆:

@Bean("reactiveNeo4jDatabaseNameProvider")
public ReactiveDatabaseSelectionProvider reactiveDatabaseSelectionProvider() {

    log.info("Database selection step");

    return () -> getRealmFromContext()
            .flatMap(realmId -> {
                Flux<String> stringFlux = translateRealmTodbname(realmId);
                Mono<DatabaseSelection> next = stringFlux.map(DatabaseSelection::byName).next();
                        return next;
                    }
            )
            .switchIfEmpty(Mono.just(DatabaseSelection.undecided()));
}

其任务是在运行时选择数据库名称,以读取Reactor上下文中包含的一些数据,这些数据由webfilter过滤器功能填充:

public Mono<Void> filter(ServerWebExchange serverWebExchange,WebFilterChain webFilterChain) {

    ....


    return webFilterChain.filter(serverWebExchange)
            .subscriberContext(e -> e.put("realmId","some string"));

一切都按预期工作:我可以从db选择器Bean中的上下文中读取内容,但是我需要将选择信息传达回webfilter,后者应在最终响应中添加特定的标头。 我在想像这样的东西

serverWebExchange.getResponse().beforeCommit(() -> {
    Mono.subscriberContext().doOnNext(ctx,{
       // fetch the selected db value here and add the header
    });
});

问题是,如何在上下文中添加一些新内容并通过上面的函数将其提取

编辑:getRealmFromContext()函数订阅上下文并将其映射以获取领域值。

最好

FB

解决方法

好吧,在挖掘之后,我没有按照我期望的方式进行计算;我只是解决了这个问题

Mono.zip(Mono.just(serverWebExchange.getResponse()),selectionDbService.translateRealmToDbName(realmId))
        .subscribe(objects -> objects.getT1().beforeCommit(() -> {
            serverWebExchange.getResponse().getHeaders().add(COMPANY_HEADER_NAME_RESPONSE,objects.getT2());
            return Mono.empty();
        }) );

为了避免两次调用该服务,我使用了一个缓存系统。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。