当前位置: 首页 > 知识库问答 >
问题:

Spring MVC应用程序中JPA与反应代码的混合

汪鸿志
2023-03-14

我有一个Spring MVC(不是WebFlux)应用程序,它使用WebFlux项目中的WebClient类。除了与WebClient相关的代码之外,应用程序中的所有现有代码都是基于CompletableFuture的异步代码,对JPA的阻塞调用通常是这样进行的:

@Service
public class MyService {
  private final MyRepository repo;
  private final Executor executor;  // configured by me & injected by Spring

  ...

  @Async
  public CompletableFuture<MyResult> doSomething() {
    return CompletableFuture
        .supplyAsync(() => repo.findById(...), executor)
        .thenApply(...);
  }
}

但是,对于WebClient,我不再确定如何根据WebClient返回的结果调用JPA。例如:

public Mono<Foo> fetchFooUsingWebClient() { ... }

public void saveFooBlocking(Foo foo) { /* uses JPA */ }

// Option 1
fetchFooUsingWebClient()
    .flatMap(foo -> {
      var cf = CompletableFuture.runAsync(() => saveFooBlocking(foo), executor);
      return Mono.fromFuture(cf);
    });

// Option 2
fetchFooUsingWebClient()
    .flatMap(foo -> Mono.fromRunnable(() => saveFooBlocking(foo)));
  • mono.FromRunnable不接受执行器。它是否在自己的调度器线程上运行runnable
  • 我听说在Spring MVC应用程序中使用反应式WebClient也会带来性能优势。但是在我的例子中,我已经在整个MVC应用程序中使用了自己的执行器,使用mono.fromrunnable而不是自己的执行器不好吗?

(我找到了相关的Spring文档,它描述了如何使用publishon进行阻塞调用,但我认为这是针对我有反应性WebFlux应用程序的场景。对于MVC应用程序,我找不到任何相关文档。)

共有1个答案

别烨熠
2023-03-14

WebClient的工作线程非常有限,您不应该对这些线程执行阻塞操作(选项2),我假设您不想使用选项1,它不容易阅读,也不是非常必要。在你的情况下,你可以做

fetchFooUsingWebClient()
.publishOn(Schedulers.boundedElastic())
.map(foo -> saveFooBlocking(foo))
//.bla - other operators, eg. doOnNext, doOnError, etc
.subscribe() // or .block() if you want to get the result, note, this will blcok the caller thread (which calls fetchFooUsingWebClient)
 类似资料:
  • 问题内容: 我正在使用带有react的ES6 babel,现在对于较新版本的react,react DOM不再是它的一部分。我对以下代码的怀疑是,这是第一行吗?因为我无处需要React,但最后一行需要ReactDOM。 问题答案: 从版本开始,React 分为两个部分: React 和 ReactDOM。 您正在使用。因此,对您而言,在组件中绝对有意义。但是就React而言,尽管您不是直接使用Re

  • Rax 支持在项目中使用小程序原生组件,同时使用 Rax 开发的组件同样支持在原生小程序项目中使用。 在 Rax 项目中使用小程序原生组件 Rax 转小程序链路使用小程序原生组件目前支持以下两种方式: 通过 npm 安装 将源码拷贝至本地使用 通过 npm 安装 你可以通过 npm 安装的方式在 Rax 项目中使用小程序原生组件,前提是 package.json 中需要配置 miniappConf

  • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

  • 问题内容: 由于fxml- files使用Controller类来处理事件,因此如何混淆JavaFX应用程序?当混淆的conntroller类具有不同的名称和路径时,fxml文件将找不到它们。 混淆后编辑fxml文件不是我想要的解决方案。 还有其他选择吗? 问题答案: 没有意义重塑轮子; 快速的google搜索产生了这个网站。 它使用Proguard混淆器。

  • 我是一名PHP、HTML5、CSS3、Javascript、Jquery、Angular的全栈开发人员,热衷于学习任何新技术 现在,我有了一个混合移动应用程序项目(更简单,只需少量的curd操作和web服务),而且它还将是web应用程序,我需要尽快交付。所以我的问题是为正确的工作选择正确的工具 混合应用程序可以使用 平台:Phonegap或cordova,根据我的理解,cordova是Phoneg

  • 执行测试脚本后,我看到控制台“驱动程序null”错误 剧本: 如果我错过了什么,有人能帮忙吗。谢谢,