Spring WebFlux 中的同步方法?

Synchronized method in Spring WebFlux?

我正在尝试保留一个 singleton class 并且我想确保它保持单例。在 Spring WebFlux 中同步方法调用的正确方法是什么?

我有以下服务方式:

public Mono<SingletonClass> saveOrUpdate(SingletonClass singletonClass) {
    return this.getTheSingletonClass()
               .map(someLogicAndSave)
               .switchIfEmpty(singletonClassRepository.save(singletonClass);
}

我应该在 saveOrUpdate 方法中添加 synchronized 关键字吗?

  • 问:SpringWebFlux 中的同步方法? (或任何 Mono/Flux)
  • A:如果可以的话,再想一个更好的办法。首先,用Project reactor写的时候不要用synchronize关键字。将每个函数视为流的一小部分。 Project Reactor 为您提供的工具可以更好地控制您尝试同步的流。更好的控制。其次,你不应该同步任何东西,除非你正在改变某些东西(你应该这样做主要是为了优化目的)。反应式编程主要是关于回调;当有人想要任务的结果时,任务将 运行 并且当任务完成时,有人(不是你)将调用你提供的函数,并将任务的结果作为参数。 同步意味着等待一个线程完成做某事,以便另一个线程也可以做那件事。尝试看看您是否可以将实际逻辑更改为不可变的,以便多个线程可以同时执行该逻辑。 如果没有,请继续阅读。

调用 saveOrUpdate 时,您将返回一个表示任务结果的 Mono。只有当有人订阅任务时才会有实际结果(===你调用函数 saveOrUpdate 得到的 Mono)。换句话说,saveOrUpdate 只有 returns 流的描述 === 当有人在流的顶部推送一个新值时,流应该做什么(从上到下)。

  • 问:我应该在 saveOrUpdate 方法中添加 synchronized 关键字吗?
  • A:不。作为上述解释的结论,多次调用 saveOrUpdate 除了创建和返回流的描述之外不会做太多事情。应该(可能)同步的方法是实际改变某些东西并且可以从多个线程同时调用的方法。

至此,您对什么是流有了基本的了解。下一步是在 Project ReactorMono/Flux 库)中学习多线程。

  • 问:在 Spring WebFlux 中同步方法调用的正确方法是什么?
  • A:我不确定我明白你的意思。在我解释完所有内容后,这个问题是否仍然相关?如果是,请考虑重新措辞(编辑问题)。

备注:

流中的表达式求值:

您应该仔细查看示例中的表达式:singletonClassRepository.save(singletonClass)。流应该仅在有人订阅它时执行。在您的示例中,这段代码是 canwill 的表达式 在方法 saveOrUpdate 执行时被评估。结果,部分流甚至在有人订阅它之前就开始执行了(singletonClassRepository.save(singletonClass) 而流的其余部分只有在有人订阅它时才会执行。

这设计不错。但是如果 singletonClassRepository.save(singletonClass) 正在做一些变异,你应该考虑同步方法 saveOrUpdate.

如何同步

仅使用 Project Reactor 提供的工具之一同步concatMapflatMap 等等上。