Rx java2 Spring反应堆多重订阅

Rx java2 Spring反应堆多重订阅,rx-java2,spring-webflux,project-reactor,Rx Java2,Spring Webflux,Project Reactor,我正在尝试将我的mono拆分为其他分离的mono,这些mono将在不同线程上处理相同的数据输入数据 public Mono<String> process() { Mono<String> someString = ... // fetching data from API someString .publishOn(Schedulers.fromExecutorService(Executors.

我正在尝试将我的mono拆分为其他分离的mono,这些mono将在不同线程上处理相同的数据输入数据

public Mono<String> process() { 
        Mono<String> someString = ... // fetching data from API 



        someString
                .publishOn(Schedulers.fromExecutorService(Executors.newFixedThreadPool(2)))
                .map(String::toLowerCase)
                .subscribe(this::saveLowercase);

        someString
                .publishOn(Schedulers.fromExecutorService(Executors.newFixedThreadPool(2)))
                .map(String::toUpperCase)
                .subscribe(this::saveUpperCase);

        return someString;
}
public Mono进程(){
Mono someString=…//正在从API获取数据
一些字符串
.publishOn(Schedulers.fromExecutorService(Executors.newFixedThreadPool(2)))
.map(字符串::toLowerCase)
.subscribe(此::saveLowercase);
一些字符串
.publishOn(Schedulers.fromExecutorService(Executors.newFixedThreadPool(2)))
.map(字符串::toUpperCase)
.subscribe(此::saveUpperCase);
返回sometstring;
}

我在日志中看到我提取了3次数据,因为每个订阅调用都从API提取数据。我想使用.cache()方法,但我想知道是否有一些新的更好的方法可以只调用一次API并处理这些数据?如果Reactor不能做到这一点,我可以将Reactor转换成RxJava

在您给出的示例中,您创建了一个cold
Mono
。因此,正如您所说,
HTTP
呼叫将针对每个
订户进行。如果希望
HTTP
调用只发生一次,请创建hot observable。您必须使用
.cache()
,以便将来的订户都能得到响应

这是正确的方法。你为什么要找“更好的东西”

官方文件中的示例:

DirectProcessor<String> hotSource = DirectProcessor.create();

Flux<String> hotFlux = hotSource.map(String::toUpperCase).cache();


hotFlux.subscribe(d -> System.out.println("Subscriber 1 to Hot Source: "+d));

hotSource.onNext("blue");
hotSource.onNext("green");

hotFlux.subscribe(d -> System.out.println("Subscriber 2 to Hot Source: "+d));

hotSource.onNext("orange");
hotSource.onNext("purple");
hotSource.onComplete(); 
DirectProcessor hotSource=DirectProcessor.create();
通量hotFlux=hotSource.map(字符串::toUpperCase.cache();
订阅(d->System.out.println(“订阅方1到热源:+d”);
hotSource.onNext(“蓝色”);
hotSource.onNext(“绿色”);
订阅(d->System.out.println(“订阅方2到热源:+d”);
hotSource.onNext(“橙色”);
hotSource.onNext(“紫色”);
hotSource.onComplete();

两位订户现在都将获得所有颜色。

我认为您需要后退一步,阅读反应式编程的基础知识。用户是发起呼叫的用户、web客户端、gui或调度程序等。您几乎从来没有像这里这样在自己的应用程序中订阅过。最后的解决方案是publish方法,它可以用作子流事件,此操作不会向上游调用新订阅。