Scala/Play/Akka:延迟动作响应
我有一个简单的Play应用程序,其中控制器动作调用model方法,该方法执行一些计算并返回结果。我需要的是动作响应随机延迟1-5秒。我对Akka几乎没有经验,但我不知道如何完成我需要的 控制器示例:Scala/Play/Akka:延迟动作响应,scala,concurrency,playframework,playframework-2.0,Scala,Concurrency,Playframework,Playframework 2.0,我有一个简单的Play应用程序,其中控制器动作调用model方法,该方法执行一些计算并返回结果。我需要的是动作响应随机延迟1-5秒。我对Akka几乎没有经验,但我不知道如何完成我需要的 控制器示例: package controllers import scala.util.Random import play.api._ import play.api.mvc._ import models.MyModel object Application extends Controlle
package controllers
import scala.util.Random
import play.api._
import play.api.mvc._
import models.MyModel
object Application extends Controller {
def calculate = Action { implicit request =>
val result = MyModel.calculate()
val delay = Random.nextInt(6)
//This response must be delayed somehow
Ok(result)
}
}
示例模型:
package models
object MyModel {
def calculate = {
//calculation happens here
}
}
更新-解决方案senia的答案有效,但带有反对警告。该代码符合第2.2.1节:
import play.api.libs.concurrent.Promise
import play.api.libs.concurrent.Execution.Implicits.defaultContext
def calculate = Action.async {
val result = MyModel.calculate()
val delay = Random.nextInt(6)
val delayed = Promise.timeout(result, delay.second)
delayed.map(Ok(_))
}
请参阅play framework文档中的暂停/处理超时
def calculate = Action.async { implicit request =>
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import scala.concurrent.duration._
val result = MyModel.calculate()
val delay = Random.nextInt(6)
val delayed = play.api.libs.concurrent.Promise.timeout(result, delay.seconds)
delayed.map{Ok(_)}
}
谢谢,这很好用。不过需要注意的是,我在trait Results中得到一个警告
方法Async已被弃用:使用Action.Async来构建异步操作。现在我有了更清楚的想法,我会看看我是否能解决这个问题。