Pet*_*ter 3 java project-reactor spring-webflux
我正在尝试保留一个singleton类,并且我想确保它保持单身。同步方法调用的正确方法是什么Spring WebFlux?
我有以下服务方法:
public Mono<SingletonClass> saveOrUpdate(SingletonClass singletonClass) {
return this.getTheSingletonClass()
.map(someLogicAndSave)
.switchIfEmpty(singletonClassRepository.save(singletonClass);
}
Run Code Online (Sandbox Code Playgroud)
我应该在方法中添加synchronized关键字吗saveOrUpdate?
synchronize用Projectreactor编写时不要使用关键字。将每个函数视为流的一小部分。Project Reactor为您提供了可以更好地控制您尝试同步的流的工具。更好的控制。其次,除非您正在改变某些内容(您应该主要出于优化目的而这样做),否则您不应该同步任何内容。React 编程主要是回调;当有人想要任务的结果时,任务就会运行,当任务完成时,有人(不是你)将调用你提供的函数,并将任务的结果作为参数。同步意味着等待一个线程完成某件事,以便另一个线程也可以做那件事。尝试看看是否可以将实际逻辑更改为不可变,以便多个线程可以同时执行该逻辑。如果没有,请继续阅读。当调用 时saveOrUpdate,您会返回一个表示任务结果的 Mono。只有当有人订阅该任务时,实际结果才会出现(===您通过调用该函数获得的 Mono saveOrUpdate)。换句话说,saveOrUpdate仅返回流的描述 === 当有人在流顶部推送新值时流应该做什么(从上到下)。
saveOrUpdate?saveOrUpdate多次调用除了创建和返回流的描述之外不会做太多事情。应该(也许)同步的方法是实际改变某些内容并且可以从多个线程同时调用的方法。到现在为止,您已经了解了什么是流的基本知识。下一步是学习Project Reactor(Mono/Flux库)中的多线程。
流中的表达式求值:
您应该仔细查看表达式:singletonClassRepository.save(singletonClass)在您的示例中。流应该仅在有人订阅时执行。在您的示例中,这段代码是一个表达式,可以并且将saveOrUpdate在执行方法时对其进行求值。因此,流的一部分甚至在有人订阅它之前就正在执行(singletonClassRepository.save(singletonClass)而流的其余部分只有在有人订阅它时才会执行。
这不是一个糟糕的设计。但如果singletonClassRepository.save(singletonClass)正在做一些改变,你应该考虑同步该方法saveOrUpdate。
如何同步
仅与Project Reactor提供的工具之一同步:concatMap等等flatMap。