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

问题描述

我有这个豆:

@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();
        }) );

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