在喷雾路由中异步执行一些逻辑
Execute some logic asynchronously in spray routing
这是我的简单路由应用程序:
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")
}
}
}
}
}
}
我想要实现的是在我的路径指令中异步执行一些逻辑,不等待结果,return立即 HTTP 200 OK。
我对Scala和spray比较陌生,想知道有没有spray way
可以解决这个具体问题。否则我会为每个请求创建 Actor
并让它完成工作。请指教。
在 spray 中没有特殊的处理方式:只需触发您的异步操作(返回 Future
的方法、发送给演员的消息等),然后立即调用 complete
。
def doStuffAsync = Future {
// literally anything
}
path("meter" / JavaUUID) { meterUUID =>
pathEnd {
post {
entity(as[Usage]) { usage =>
doStuffAsync()
complete("OK")
}
}
}
}
相反,如果您需要在发送响应之前等待异步操作完成,您可以使用特定于 spray 的指令来处理 Futures 或 Actors。
这是我的简单路由应用程序:
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")
}
}
}
}
}
}
我想要实现的是在我的路径指令中异步执行一些逻辑,不等待结果,return立即 HTTP 200 OK。
我对Scala和spray比较陌生,想知道有没有spray way
可以解决这个具体问题。否则我会为每个请求创建 Actor
并让它完成工作。请指教。
在 spray 中没有特殊的处理方式:只需触发您的异步操作(返回 Future
的方法、发送给演员的消息等),然后立即调用 complete
。
def doStuffAsync = Future {
// literally anything
}
path("meter" / JavaUUID) { meterUUID =>
pathEnd {
post {
entity(as[Usage]) { usage =>
doStuffAsync()
complete("OK")
}
}
}
}
相反,如果您需要在发送响应之前等待异步操作完成,您可以使用特定于 spray 的指令来处理 Futures 或 Actors。