我对在同一方法中使用多个Scheduler策略有疑问。
Function<Object, Flux<String>> fetchGreekGods = obj -> {
return Flux.just(this.config.getApiMap().get(GREEK))
.publishOn(Schedulers.immediate())
.map(toURL)
.map(fetch)
.flatMap(serializeFlux)
.log();
};
Function<Flux<String>, Flux<Tuple2<String, Integer>>> fetchWikipediaGodInfo = god -> {
return Flux.from(god)
.publishOn(Schedulers.elastic())
.map(str -> {
return new Tuple2<String, Integer>(str, generateWikiAddress
.andThen(toURL)
.andThen(fetch)
.andThen(String::length)
.apply(str));
})
.log();
};
Function<Flux<Tuple2<String, Integer>>, Flux<String>> max = godInfo -> {
return Flux.from(godInfo)
.publishOn(Schedulers.immediate())
.sort(Comparator.comparing(Tuple2::_2))
.takeLast(1)
.map(t -> t._1)
.log();
};
public Mono<String> reactorSolution() {
return Flux.empty()
.transform(fetchGreekGods)
.transform(fetchWikipediaGodInfo)
.transform(max)
.next();
}
为什么如果我为每个转换定义不同的调度程序,那么在上一个中,在执行Max中,在日志中时,我会遵循上一个策略:fetchWikipediaGodInfo
在逻辑上,我希望对于max
,该代码使用主线程,但是目前,我观察到前一个。
2019-09-22 18:08:30 [elastic-2] INFO reactor.Flux.MapFuseable.3 - | onNext(Apollo)
2019-09-22 18:08:30 [elastic-2] INFO reactor.Flux.MapFuseable.3 - | cancel()
2019-09-22 18:08:30 [elastic-2] INFO reactor.Flux.MapFuseable.3 - | onComplete()
理论上,第三个转换应在主线程中运行,但是当前该方法在弹性模式下运行,但这是不正确的,因为我明确定义要在主线程中运行。
如何解决?
非常感谢
胡安·安东尼奥
答案 0 :(得分:0)
根据有关Schedulers的文档
Schedulers类具有静态方法,这些方法可以访问 以下执行上下文:
- 当前线程(Schedulers.immediate())。
当前线程不必是主线程,也可以是最后一个线程。而且之前的转换是使用弹性的。