gpt4 book ai didi

scala - Play Framework 异步 Controller 阻止对同一 Controller 的后续调用

转载 作者:行者123 更新时间:2023-12-01 04:32:27 25 4
gpt4 key购买 nike

我的目标是从异步 Controller 做一些数据库查询,然后返回答案。
我正在使用示例项目,现在只是模拟带有 sleep 的数据库查询,但我注意到无论我做什么,REST 接口(interface)甚至不会启动第二个查询的 sleep ,直到第一个查询完成。
例如:如果我从浏览器中的一个选项卡调用 REST 接口(interface),然后在 1 秒后再次从另一个选项卡调用,我希望第二个也能在 10 秒内得到回复,但实际上是 19。
此外,它似乎也没有使用“database-io”池:

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

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


我的代码:

@Singleton
class AsyncController @Inject()(cc: ControllerComponents, actorSystem: ActorSystem) extends AbstractController(cc) {

implicit val executionContext = actorSystem.dispatchers.lookup("database-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 second) {
val blockingPool = Thread.currentThread().getName;
println(s"""2: $blockingPool""")

Thread.sleep(10000)
promise.success("Hi!")
}(actorSystem.dispatcher)
promise.future
}

}

最佳答案

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

  • 您使用开发模式(1 个线程),或者您的产品配置仅配置为一个线程。
  • 浏览器会阻止第二个请求,直到收到第一个请求的响应。这句话:“如果我从浏览器中的一个选项卡调用 REST 接口(interface)。”尝试从不同的浏览器做同样的事情。
  • 关于scala - Play Framework 异步 Controller 阻止对同一 Controller 的后续调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53102578/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com