Моя цель - выполнить несколько запросов к базе данных с асинхронного контроллера, а затем вернуть ответ.
Я играю с примером проекта, сейчас просто имитирую запросы к БД с помощью сна, но я заметил, что, что бы я ни делал, интерфейс REST даже не запускает сон второго запроса до тех пор, пока первый один заканчивает.
Например: если я вызываю интерфейс REST из одной вкладки в браузере, а затем через 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
}
}