我试图理解Spray的分离指令以及使用分离和使用onComplete指令之间是否有任何区别。我想要实现的是"每个请求一个线程"其中by thread我指的是JVM线程(应该是一个OS线程)。
那么,A和B之间的区别是什么?
方法A:
// 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}")
}
}
} }
干杯!
答案 0 :(得分:0)
detach
的要点是你不需要你的方法来返回Future
- 这就是它。
这个想法是运行你知道的项不会紧凑地抛出异常,但不需要阻塞处理程序线程。您应该将方法B 重写为:
detach(global) {
complete(s"The result was ${controller.divide(a, b)}")
}
在喷涂路由领域,Failure
案例将由外部handleExceptions
指令处理。
答案 1 :(得分:0)
请参阅Spray's `detach` Directive 接受答案解释得非常好,