繁体   English   中英

在后台播放框架Scala运行作业

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM