【问题标题】:Understanding Spray's detach directive了解 Spray 的分离指令
【发布时间】:2015-10-16 18:37:59
【问题描述】:

我正在尝试了解 Spray 的 detach 指令以及使用 detach 和使用 onComplete 指令之间是否有任何区别。我想要实现的是“每个请求一个线程”,其中线程是指 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}")
          }
      }
} }

干杯!

【问题讨论】:

标签: scala future spray


【解决方案1】:

detach 的意义在于您不需要您的方法返回 Future - 就是这样。

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

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

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

【讨论】:

  • 并由此产生一个新线程来执行 divide(a,b) ?干杯!
  • 它将在global 中运行,即您提供的执行上下文(或范围内的隐式执行上下文,如果您未明确提供)。通常,执行上下文管理它们自己的线程池,并且可能会或可能不会立即产生新线程。
【解决方案2】:

查看Spray's `detach` Directive接受答案很好地解释了,什么

  • 分离确实和
  • 它如何与路由执行参与者分离。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 2016-04-26
    • 2018-03-05
    • 2013-12-31
    • 1970-01-01
    相关资源
    最近更新 更多