了解 Spray 的分离指令

Understanding Spray's detach directive

我正在尝试了解 Spray 的 detach 指令以及使用 detach 和使用 onComplete 指令之间是否有任何区别。我想要实现的是 "one thread per request" 线程,我指的是 JVM 线程(应该是 OS 线程)。

那么,A 和 B 之间有什么区别?

方法一:

// assume controller.divide(a,b) returns Future[Int]  

val route =
  path("divide" / IntNumber / IntNumber) { (a, b) =>
    onComplete(controller.divide(a, b)) {
      case Success(value) => complete(s"The result was $value")
      case Failure(ex)    => complete(InternalServerError, s"An error occurred: ${ex.getMessage}")
    }
  }

方法B:

// assume controller.divide(a,b) returns Int
val route = {
    path("divide" / IntNumber / IntNumber) { (a,b) => 
      detach(global) {
          Try { controller.divide(a,b) } match {
              case Success(value) => complete(s"The result was $value")
              case Failure(ex) => complete(InternalServerError, s"An error occurred: ${ex.getMessage}")
          }
      }
} }

干杯!

detach 的要点是您不需要您的方法来 return Future - 就是这样。

想法是 运行 您知道的项目不会紧凑地抛出异常,但不需要阻塞处理程序线程。您应该将 方法 B 重写为:

detach(global) {
  complete(s"The result was ${controller.divide(a, b)}")
}

在喷雾路由世界中,Failure 情况将由外部 handleExceptions 指令处理。

参见 接受 答案解释得很好,

  • 分离并
  • 它如何与路由执行角色分离。