【问题标题】:Schedulers in Project Reactor with Spring Webflux带有 Spring Webflux 的 Project Reactor 中的调度程序
【发布时间】:2021-07-30 11:55:07
【问题描述】:

Project Reactor 很棒,我可以很容易地切换一个线程来处理另一个线程上的某些部分,但是我已经查看了 Schedulers.fromExecutorService() 方法,并且这个方法每次都会分配新的 ExecutorService。因此,当调用此方法时,调度程序总是会再次创建和分配。我不确定,但我认为它可能存在内存泄漏......


Mono<String> sometext() {
return Mono
.fromCallable(() -> "" )
.subscribeOn(Schedulers.newParallel("my-custom));
}

我想知道将 Scheduler 注册为 bean,它是单例的,所以不会每次都分配一次或在构造函数中创建他。很多博客都是这样解释线程模型的。

...
private final Scheduler scheduler = Schedulers.newParallel("my-custom);
..
Mono.fromCallable(() -> "" ).subscribeOn(scheduler)

【问题讨论】:

    标签: spring-webflux project-reactor


    【解决方案1】:

    Schedulers.newParallel() 确实会在您每次调用它时创建一个新的调度程序,并带有关联的支持线程池 - 所以是的,您是正确的,如果您使用的是该方法,那么您要确保存储对它的引用某个地方,以便您可以重复使用它。简单地提供相同的name 参数不仅会检索新的调度程序,它只会创建一个具有相同名称的不同调度程序。

    如何做到这一点取决于您 - 它可以通过 spring bean(只要它是单例而不是原型 bean!)、字段或任何其他最适合您的用例的方式。

    但是,在所有这些之前,我首先要考虑您是否确实需要创建一个单独的并行调度程序。 Schedulers.parallel() 调度程序是一个默认的并行调度程序,可用于并行工作(它不会在每次调用时创建一个新的),除非您出于某种原因需要为单独的服务单独配置并行调度程序,否则最好实践就是使用它。

    【讨论】:

      猜你喜欢
      • 2020-09-12
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 2018-09-09
      • 2018-09-04
      • 2022-06-05
      相关资源
      最近更新 更多