Rx java2 Spring反应堆多重订阅
我正在尝试将我的mono拆分为其他分离的mono,这些mono将在不同线程上处理相同的数据输入数据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.
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方法,它可以用作子流事件,此操作不会向上游调用新订阅。