Scala Play Framework异步控制器阻止对同一控制器的后续调用
我的目标是从异步控制器执行一些数据库查询,然后返回答案 我正在玩示例项目,现在只是用睡眠模拟DB查询,但我注意到,无论我做什么,REST接口都不会启动第二个查询的睡眠,直到第一个查询完成。 例如:如果我从浏览器中的一个选项卡调用REST界面,然后1秒后再从另一个选项卡调用,我希望第二个选项卡也能在10秒内得到回复,但实际上是19 此外,它似乎也不使用“数据库io”池: 1:application-akka.actor.default-dispatcher-2 2:application-akka.actor.default-dispatcher-5 我的代码:Scala Play Framework异步控制器阻止对同一控制器的后续调用,scala,asynchronous,playframework,Scala,Asynchronous,Playframework,我的目标是从异步控制器执行一些数据库查询,然后返回答案 我正在玩示例项目,现在只是用睡眠模拟DB查询,但我注意到,无论我做什么,REST接口都不会启动第二个查询的睡眠,直到第一个查询完成。 例如:如果我从浏览器中的一个选项卡调用REST界面,然后1秒后再从另一个选项卡调用,我希望第二个选项卡也能在10秒内得到回复,但实际上是19 此外,它似乎也不使用“数据库io”池: 1:application-akka.actor.default-dispatcher-2 2:application-akka
@Singleton
类AsyncController@Inject()(cc:ControllerComponents,actorSystem:actorSystem)扩展了AbstractController(cc){
隐式val executionContext=actorSystem.dispatchers.lookup(“数据库io”)
def message=Action.async{
getFutureMessage().map{msg=>Ok(msg)}
}
private def getFutureMessage():Future[String]={
val defaultThreadPool=Thread.currentThread().getName;
println(s“1:$defaultThreadPool”)
val promise:promise[String]=promise[String]()
actorSystem.scheduler.scheduleOnce(0秒){
val blockingPool=Thread.currentThread().getName;
println(s“2:$blockingPool”)
线程。睡眠(10000)
承诺,成功(“嗨!”)
}(actorSystem.dispatcher)
前途
}
}
这种行为可能有两个原因:
您需要避免阻塞代码。基本上:
未来结果可能带来的任何故障
def userAge (userId: String): Future[Int] = ???
然后映射到其中:
userAge.map{
age => ??? //everything is ok
}.recover{ case e: Throwable => ??? //Do something when it fails
请注意,如果您有多个调用,则另一个
map
将变成flatMap
,因为您想要Future[…]
一些东西,而不是Future[Future[…]
谢谢,这是第二次。:)