Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Play Framework异步控制器阻止对同一控制器的后续调用_Scala_Asynchronous_Playframework - Fatal编程技术网

Scala Play Framework异步控制器阻止对同一控制器的后续调用

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

我的目标是从异步控制器执行一些数据库查询,然后返回答案

我正在玩示例项目,现在只是用睡眠模拟DB查询,但我注意到,无论我做什么,REST接口都不会启动第二个查询的睡眠,直到第一个查询完成。 例如:如果我从浏览器中的一个选项卡调用REST界面,然后1秒后再从另一个选项卡调用,我希望第二个选项卡也能在10秒内得到回复,但实际上是19

此外,它似乎也不使用“数据库io”池:

1:application-akka.actor.default-dispatcher-2

2:application-akka.actor.default-dispatcher-5

我的代码:

@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)
前途
}
}

这种行为可能有两个原因:

  • 您使用开发模式(1个线程),或者仅为一个线程配置产品配置
  • 浏览器会阻止第二个请求,直到收到第一个请求的响应。这句话是:“如果我从浏览器中的一个选项卡调用REST界面。”尝试在不同的浏览器中执行相同的操作
    您需要避免阻塞代码。基本上:

  • 您可以创建一个返回未来的方法

  • 你把地图画进去

  • 您可以恢复
    未来结果可能带来的任何故障

  • 假设我有:

    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[…]

    谢谢,这是第二次。:)