【问题标题】:Play framework scala POST and Future播放框架scala POST和Future
【发布时间】:2020-06-22 06:47:21
【问题描述】:

我的控制器中有这个动作

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

这是路线

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

我想返回 Ok 结果,而不是等待 Future。

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

【问题讨论】:

  • 您的实际 poc 实现是 Thread.sleep 还是只是这个问题的存根?
  • 根据您当前的实现,Ok 响应将立即返回,而无需等待Future 完成,因为您没有使用Action.async,而只是Action.apply,它接受Response 类型而不是@ 987654329@。请提供更多详细信息,为什么它不适用于 POST 请求?谢谢
  • 但是在 3-4 个请求之后(取决于 cpu 核心的数量),你所有的线程都会被阻塞。在其中一个线程可用之前,不会处理下一个请求。
  • 是的,你必须有一个单独的ExecutionContext 只是为了你不等待的Futures。如果你被请求淹没,那么这个执行器可能跟不上。
  • @SarveshKumarSingh 我的实现是一个发送邮件的服务,但是问题是一样的

标签: scala playframework future blocking


【解决方案1】:

根据 Mateusz 的建议,例如将阻塞调用转移到 separate thread pool

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

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

  Ok("")
}

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2013-09-22
  • 2013-07-11
相关资源
最近更新 更多