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