[英]Play framework Scala run job in background
有什么方法可以触发控制器中的作业(不等待其完成)并向用户显示该作业将在后台运行的消息?
我有一个控制器方法,需要很长时间才能运行。 因此,我想使其离线运行,并向用户显示将在后台运行的消息。
我尝试了如下所示的Action.async。 但是,对Future对象的处理仍然需要花费更多时间,并且会变得超时。
def submit(id: Int) = Action.async(parse.multipartFormData) { implicit request =>
val result = Future {
//process the data
}
result map {
res =>
Redirect(routes.testController.list()).flashing(("success", s"Job(s) will be ruuning in background."))
}
}
您还可以返回结果,而不必以“抛弃式”的方式等待未来的结果
def submit(id: Int) = Action(parse.multipartFormData) { implicit request =>
Future {
//process the data
}
Redirect(routes.testController.list()).flashing(("success", s"Job(s) will be running in background."))
}
文档状态:
通过提供Future [Result]而不是普通的Result,我们可以快速生成结果而不会阻塞。 兑现承诺后,Play就可以提供结果。
等待响应时, Web客户端将被阻止 ,但是服务器上不会阻止任何内容,并且服务器资源可用于为其他客户端提供服务。
您可以将客户端代码配置为使用ajax请求,并在页面的某些部分显示“ 等待数据”消息,而不会阻止其余页面的加载。
我还尝试了“ Futures.timeout”选项。 似乎工作正常。 但是我不确定它是否正确。
result.withTimeout(20.seconds)(futures).map { res =>
Redirect(routes.testController.list()).flashing(("success", s"Job(s) will be updated in background."))
}.recover {
case e: scala.concurrent.TimeoutException =>
Redirect(routes.testController.list()).flashing(("success", s"Job(s) will be updated in background."))
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.