Выполнить некоторую логику асинхронно в маршрутизации спрея
Вот мое простое приложение для маршрутизации:
object Main extends App with SimpleRoutingApp {
implicit val system = ActorSystem("my-system")
startServer(interface = "0.0.0.0", port = System.getenv("PORT").toInt) {
import format.UsageJsonFormat._
import spray.httpx.SprayJsonSupport._
path("") {
get {
complete("OK")
}
} ~
path("meter" / JavaUUID) {
meterUUID => pathEnd {
post {
entity(as[Usage]) {
usage =>
// execute some logic asynchronously
// do not wait for the result
complete("OK")
}
}
}
}
}
}
Чего я хочу добиться - это выполнить некоторую логику асинхронно в моей директиве пути, не ждать результата и немедленно возвращать HTTP 200 OK.
Я довольно новичок в Scala и спрей и интересно, есть ли spray way
решить эту конкретную проблему. В противном случае я бы пошел в направлении создания Actor
за каждый запрос и позволить ему сделать работу. Пожалуйста посоветуй.
1 ответ
Нет особого способа справиться с этим в спрее: просто запустите асинхронное действие (метод, возвращающий Future
сообщение, отправленное актеру, что угодно) и вызов complete
сразу после.
def doStuffAsync = Future {
// literally anything
}
path("meter" / JavaUUID) { meterUUID =>
pathEnd {
post {
entity(as[Usage]) { usage =>
doStuffAsync()
complete("OK")
}
}
}
}
И наоборот, если вам нужно дождаться завершения асинхронного действия перед отправкой ответа, вы можете использовать специфические для распыления директивы для работы с фьючерсами или актерами.