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

使用CompletableFutures和java时的PlayFramework定制执行器

茅昀
2023-03-14

现在,当我们知道提交给cf的工作是一个长时间运行的IO操作时,我们需要传递一个自定义执行器(否则默认情况下它将在fjp上执行)。

每个控制器执行都有一个HTTP上下文,其中包含所有请求信息。如果使用JPAEntityManagers······

如果我们只是创建自定义的ExecutorService并将其注入到控制器中,以便在SupplyAsync()中使用,那么我们将不会拥有所有的上下文信息。

下面是返回CompletionStage的某个控制器操作的示例

return supplyAsync(() -> {
   doSomeWork();
}, executors.io); // this is a custom CachedThreadPool with daemon thread factory

}

如果我们尝试在doSomework()中运行类似的内容

Request request = request(); // getting request using Controller.request()
jpa.withTransaction(
    () -> jpa.em() // we will get an exception here although we are wrapped in a transaction
             ...
);
No EntityManager bound to this thread. Try wrapping this call in JPAApi.withTransaction, or ensure that the HTTP context is setup on this thread.

使用CompletableFuture和自定义Executor时,提供所有上下文信息的正确方法是什么?

我还尝试在application.conf中定义自定义执行器,并从actor system中查找它们,但最终会得到MessageDispatcher,尽管它得到了ExecutorService的支持,但它与CompletableFuture不兼容(也许我错了?如果是这样,如何与CF一起使用它?)

共有1个答案

缪修德
2023-03-14

您可以使用play.libs.concurrent.HttpExecution.FromThread方法:

在给定的executioncontext上执行工作的executioncontext。当前线程的上下文classloaderhttp.context将在调用此方法时捕获,并为所有已执行的任务保留此方法。

因此,代码如下所示:

java.util.concurrent.Executor executor = getExecutorFromSomewhere();
return supplyAsync(() -> {
    doSomeWork();
}, play.libs.concurrent.HttpExecution.fromThread(executor));
scala.concurrent.ExecutionContext ec = getExecutorContext();
return supplyAsync(() -> {
    doSomeWork();
}, play.libs.concurrent.HttpExecution.fromThread(ec));
 类似资料:
  • 我在某个存储库类上有一个方法,它返回。完成这些期货的代码使用一个第三方库来阻止。我打算有一个单独的有界,这个存储库类将使用它来进行这些阻塞调用。 这里有一个例子: 我的应用程序的其余部分将组成这些期货,并用结果做一些其他的事情。当提供给、、等的其他函数时,我不希望它们在存储库的上运行。 另一个例子: JavaDoc声明: 为非异步方法的从属完成提供的操作可以由完成当前CompletableFutu

  • 在文档的这一部分中,他们解释了如何为 当您使用时,这是什么等价物: 当使用和时,我们如何确保上下文可用?

  • 问题内容: 我有一个“问题”实体,其中有一个“答案”,其中包含“替代品”列表,如下所示: 我想制作一个表格以供用户填充问题列表。我读了太多的材料和SO问题,但是我不知道如何正确地处理表单。我知道可以使用DynamicForms以其他方式执行此操作,这不是我想要的。我的想法是可以通过以下方式完成: 但是,当我尝试使用Answer对象并将其“替代”使用时,我的脸上会大爆炸: 我想念更多有关它和其他相关

  • 我正在用s设计异步调用。这是一个批处理调用,在这里我需要同时处理几个实体。在呼叫结束时,我必须收集关于每一个项目的处理状态的信息。 作为输入,我有这些实体的ID数组。这是一个复杂的实体,为了将一个实体编译成一个对象,我必须发出几个DAO调用。每个DAO方法都返回。 我将那些DAO调用链接起来,因为如果其中一个部分不存在,我将无法构造一个完整的对象。下面是我的代码段的样子: 问题是,由于链接的关系,

  • 我有一个用例,需要跟踪给定组件的处理时间指标,并将其用作spring boot应用程序中调优的反馈循环。我想我应该在需要监视的组件中通过一个自动连接的计量服务使用一个自定义指标,该服务工作正常,我可以在/指标endpoint中看到我的指标。我遇到的问题是如何在应用程序代码中使用这些指标。理想情况下,我希望收到每个仪表提交的结果,并计算加权移动平均值。对于spring boot执行器指标来说,这不是

  • 本文向大家介绍JS定时器使用,定时定点,固定时刻,循环执行详解,包括了JS定时器使用,定时定点,固定时刻,循环执行详解的使用技巧和注意事项,需要的朋友参考一下 本文概述:本文主要介绍通过JS实现定时定点执行,在某一个固定时刻执行某个函数的方法。比如说在下一个整点执行,在每一个整点执行,每隔10分钟定时执行的方法。 JavaScript中有两个定时器方法:setTimeout()和setInterv