在喷涂路由中异步执行一些逻辑

时间:2015-02-10 20:13:10

标签: scala akka spray

这是我的简单路由应用程序:

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 个答案:

答案 0 :(得分:3)

在喷涂中没有特殊的处理方式:只需触发异步操作(返回Future的方法,发送给演员的消息,等等)并调用complete吧后。

def doStuffAsync = Future {
   // literally anything
}

path("meter" / JavaUUID) { meterUUID =>
  pathEnd {
    post {
      entity(as[Usage]) { usage =>
        doStuffAsync()
        complete("OK")
      }
    }
  }
}

相反,如果您需要在发送响应之前等待异步操作完成,则可以使用特定于喷涂的指令来处理Futures或Actors。