java - Spring WebFlux 中的同步方法?

标签 java spring-webflux project-reactor

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

我有以下服务方式:

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

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

最佳答案

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

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

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

到目前为止,您已经了解了流是什么的基本知识。下一步是了解 Project Reactor(Mono/Flux 库)中的多线程。

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

注意事项:

流中的表达式评估:

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

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

如何同步

仅同步 Project Reactor 提供的工具之一:concatMapflatMap 等。

关于java - Spring WebFlux 中的同步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54186477/

相关文章:

java - 在 Android 中的第二个 Activity 中添加了一个返回第一个 Activity 的按钮。现在,导航到第二个 Activity 时应用程序崩溃

spring-boot - WebClient 的 bodyToMono 关于空体预期行为

kotlin - 在 WebClient onErrorResume 中反序列化没有对象映射器的错误响应

java - 仅在需要时才在 Reactor 的 Flux 中请求下一个

java - 在返回通量数据库实体之前运行异步任务

java - 如何在 hibernate 状态下规范化数据库? (重复值不会一次又一次保存)

java - Jooq 对已知数量的参数进行排序

Java - 如果 src 有连字符,则无法从 Internet 下载图像

json - Spring webflux Netty : How to expose proto as json endpoints without duplication of code?

java - 通过 SSE 订阅的 Flux 引发 cancel() 事件