第三个转换使用先前的执行器执行

时间:2019-09-22 16:16:40

标签: spring-webflux project-reactor

我对在同一方法中使用多个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()

理论上,第三个转换应在主线程中运行,但是当前该方法在弹性模式下运行,但这是不正确的,因为我明确定义要在主线程中运行。

如何解决?

非常感谢

胡安·安东尼奥

1 个答案:

答案 0 :(得分:0)

根据有关Schedulers的文档

  

Schedulers类具有静态方法,这些方法可以访问   以下执行上下文:

     
      
  • 当前线程(Schedulers.immediate())。
  •   

当前线程不必是主线程,也可以是最后一个线程。而且之前的转换是使用弹性的。