了解 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
指令处理。
参见 接受 答案解释得很好,
- 分离并
- 它如何与路由执行角色分离。
我正在尝试了解 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
指令处理。
参见
- 分离并
- 它如何与路由执行角色分离。