在喷雾路由异步执行一些逻辑(Execute some logic asynchronously in

2019-10-21 19:56发布

这是我简单的路由应用:

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为每一个请求,并让它做的工作。 请指教。

Answer 1:

还有的喷雾处理这没有什么特别的办法:只需解雇你的异步操作(返回一个方法Future ,发送到一个演员的消息,等等),并调用complete之后。

def doStuffAsync = Future {
   // literally anything
}

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

相反,如果你需要等待一个异步操作以发送响应之前完成,则可以使用特定的喷雾指令与期货还是演员工作。



文章来源: Execute some logic asynchronously in spray routing
标签: scala akka spray