Play framework scala POST和Future

Play framework scala POST和Future,scala,playframework,future,blocking,Scala,Playframework,Future,Blocking,我的控制器中有此操作 def doRegister = Action { implicit request => Future { Thread.sleep(5000) } Ok("") } 这是路线 POST/api/checkout/register controllers.shop.checkout.CheckoutAuthController.doRegister 我想返回Ok结果,不必等待未来 它适用于GET请求(立即返回),但不适用于P

我的控制器中有此操作

def doRegister = Action { implicit request =>
    Future {
      Thread.sleep(5000)
    }
    Ok("")
  }
这是路线

POST/api/checkout/register controllers.shop.checkout.CheckoutAuthController.doRegister

我想返回Ok结果,不必等待未来


它适用于GET请求(立即返回),但不适用于POST。超时将应用,进行调用的javascript vuejs项目必须等待。

根据Mateusz的建议,例如,将阻塞调用卸载到

val ecForBlockingTasks = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(5))

def doRegister = Action { implicit request =>
  Future {
    Thread.sleep(5000)
  }(ecForBlockingTasks)

  Ok("")
}

确保在应用程序启动时只创建一次线程池,否则可能会导致资源泄漏。

根据Mateusz的建议,例如,将阻塞调用卸载到

val ecForBlockingTasks = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(5))

def doRegister = Action { implicit request =>
  Future {
    Thread.sleep(5000)
  }(ecForBlockingTasks)

  Ok("")
}

请确保在应用程序启动时只创建一次线程池,否则可能会导致资源泄漏。

您的实际poc实现是
线程。sleep
还是只是这个问题的存根?根据您当前的实现,
Ok
响应将立即返回,无需等待
Future
完成,因为您没有使用
Action.async
而只是
Action.apply
接受
response
输入not
Future[response]
。请提供更多详细信息,为什么它不适用于POST请求?谢谢,但在3-4次请求之后(取决于cpu内核的数量),所有线程都将被阻塞。下一个请求将不会被处理,直到其中一个线程可用。是的,您必须有一个单独的
ExecutionContext
,只为
未来的
而不等待。如果你被大量的请求淹没,那么这个执行者可能无法跟上。@SarveshKumarSingh我的实现是一个发送邮件的服务,但问题是它与你的实际poc实现
线程相同。sleep
或者它只是这个问题的存根?根据你当前的实现,
Ok
响应将立即返回,无需等待
Future
完成,因为您没有使用
Action.async
而只是
Action.apply
接受
response
输入not
Future[response]
。请提供更多详细信息,为什么它不适用于POST请求?谢谢,但在3-4次请求之后(取决于cpu内核的数量),所有线程都将被阻塞。下一个请求将不会被处理,直到其中一个线程可用。是的,您必须有一个单独的
ExecutionContext
,只为
未来的
而不等待。如果你被大量请求淹没,那么这个执行者可能无法跟上。@SarveshKumarSingh我的实现是一个发送邮件的服务,但问题是sameI在服务中移动了阻止代码,我如何确保单独的ExecutionContext实例化一次,当它在服务中时?您可以在配置中定义它-我在服务中移动了阻止代码,如何确保单独的ExecutionContext在服务中实例化一次?您可以在配置中定义它-