Java 如何将上下文传播到ProjectReactor中的下游操作符?

Java 如何将上下文传播到ProjectReactor中的下游操作符?,java,project-reactor,Java,Project Reactor,我需要向ProjectReactor中的下游操作员传播一些上下文,但看起来他们只允许以自下而上的方式这样做 是否有办法将其从上游运营商传播到下游?我可以想象这样的包装解决方案,但我真的希望避免: private static class Contextualized<T> { private final Map<Object, Object> context; private final T content; public Contextuali

我需要向ProjectReactor中的下游操作员传播一些上下文,但看起来他们只允许以自下而上的方式这样做

是否有办法将其从上游运营商传播到下游?我可以想象这样的包装解决方案,但我真的希望避免:

private static class Contextualized<T> {
    private final Map<Object, Object> context;
    private final T content;

    public Contextualized(T content) {
        context = new HashMap<>();
        this.content = content;
    }

    public Contextualized(Map<Object, Object> context, T content) {
        this.context = context;
        this.content = content;
    }

    public Map<Object, Object> getContext() {
        return context;
    }

    public T getContent() {
        return content;
    }
}

public void someFunction() {
    Mono.just(new Contextualized<>(1))
            .map(it -> new Contextualized<>(Map.of("operation", "added 1"), it.getContent() + 1))
            .doOnNext(it -> System.out.println(it.getContext().get("operation").toString()))
            .subscribe();
    ...
}
私有静态类上下文化{
私有最终地图上下文;
私人最终T内容;
公共情境化(T内容){
context=newhashmap();
this.content=内容;
}
公共情境化(地图情境,T内容){
this.context=上下文;
this.content=内容;
}
公共映射getContext(){
返回上下文;
}
公共T getContent(){
返回内容;
}
}
公共函数(){
Mono.just(新语境化(1))
.map(it->新上下文化(map.of(“操作”,“添加1”),it.getContent()+1))
.doOnNext(it->System.out.println(it.getContext().get(“操作”).toString())
.subscribe();
...
}
您可以尝试使用

String key=“message”;
Mono r=Mono.just(“你好”)
.flatMap->Mono.subscriberContext()
.map(ctx->s+“”+ctx.get(键)))
.subscriberContext(ctx->ctx.put(键,“世界”);
步骤验证程序。创建(r)
.expectNext(“你好,世界”)
.verifyComplete();
您可以尝试使用

String key=“message”;
Mono r=Mono.just(“你好”)
.flatMap->Mono.subscriberContext()
.map(ctx->s+“”+ctx.get(键)))
.subscriberContext(ctx->ctx.put(键,“世界”);
步骤验证程序。创建(r)
.expectNext(“你好,世界”)
.verifyComplete();

您当前的解决方案很好。你可以这样做

这可能是另一种方式。但这可能不是一个优雅的解决方案

Flux.range(1, 5)
        .materialize() // convert the object to Signal<Object>
        .map(o -> {
            Context context = o.getContext().put("name", "somename");
            return o.isOnNext() ? Signal.next(o.get(), context) : Signal.complete(context);
        })
        ...
        ...
        .doOnNext(s -> System.out.println(s.getContext().get("name").toString())) // access ctx variables
        .dematerialize()  // convert the signal to regular object and lose the context here
流量范围(1,5)
.materialize()//将对象转换为信号
.map(o->{
Context Context=o.getContext().put(“name”、“somename”);
返回o.isOnNext()?Signal.next(o.get(),context):Signal.complete(context);
})
...
...
.doOnNext(s->System.out.println(s.getContext().get(“name”).toString())//访问ctx变量
.dematerialize()//将信号转换为常规对象并在此处丢失上下文

您当前的解决方案很好。你可以这样做

这可能是另一种方式。但这可能不是一个优雅的解决方案

Flux.range(1, 5)
        .materialize() // convert the object to Signal<Object>
        .map(o -> {
            Context context = o.getContext().put("name", "somename");
            return o.isOnNext() ? Signal.next(o.get(), context) : Signal.complete(context);
        })
        ...
        ...
        .doOnNext(s -> System.out.println(s.getContext().get("name").toString())) // access ctx variables
        .dematerialize()  // convert the signal to regular object and lose the context here
流量范围(1,5)
.materialize()//将对象转换为信号
.map(o->{
Context Context=o.getContext().put(“name”、“somename”);
返回o.isOnNext()?Signal.next(o.get(),context):Signal.complete(context);
})
...
...
.doOnNext(s->System.out.println(s.getContext().get(“name”).toString())//访问ctx变量
.dematerialize()//将信号转换为常规对象并在此处丢失上下文

不幸的是,这仍然是一种非常丑陋的方法。我正在寻找可以替代Spring中的请求范围bean的东西,项目中的当前代码将其用作可从多个组件访问的存储,因此我需要一种在服务之间传递数据的方法,而无需将其作为参数传递(保持签名简短)不幸的是,在这些helper类中没有包装所有内容,直到出现了一种非常丑陋的方法。我正在寻找可以替代Spring中的请求范围bean的东西,项目中的当前代码将其用作可从多个组件访问的存储,因此我需要一种在服务之间传递数据的方法,而无需将其作为参数传递(保持签名简短),也无需将所有内容包装在这些助手类中