了解Spray的分离指令

时间:2015-10-16 18:38:00

标签: scala future spray

我试图理解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}")
          }
      }
} }

干杯!

2 个答案:

答案 0 :(得分:0)

detach的要点是你不需要你的方法来返回Future - 这就是它。

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

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

在喷涂路由领域,Failure案例将由外部handleExceptions指令处理。

答案 1 :(得分:0)

请参阅Spray's `detach` Directive 接受答案解释得非常好,

  • 分离和
  • 它如何与执行演员的路线脱钩。