如何响应依赖于另一个actor的请求?

时间:2016-07-11 15:59:31

标签: akka akka-http

这可能是一个愚蠢的问题,但我需要问,因为我还没有找到答案。我使用带路由的akka​​-http和路径的典型路由模式 完成HttpRequest。

例如:

~ path("reactJS") {
  complete(
    HttpResponse(entity = HttpEntity(ContentTypes.`text/html(UTF-8)`, Source.fromFile(reactJS).mkString))
  )
}

但是,我想有一个单独的actor来处理文件系统然后,在我看来,我希望服务器将请求传递给文件处理程序actor。所以我的问题是,如何自然地完成一个依赖于另一个演员的请求呢?我想那时服务器的路由看起来像是:

 ~ path("patient" / IntNumber) { index =>
      FileHandler ! index
   }

class FileHandler extends Actor{
  def receive = {
    case msg:Int => sender() ! file handling

}

并且请求的服务必须是服务器的receive方法中的一个案例,对吧?

调查:How to respond with the result of an actor call?

1 个答案:

答案 0 :(得分:2)

我认为最好的办法是使用ask模式(?),然后在路由树中使用onComplete指令来处理从ask返回的Future。以您的示例为例,并稍微修改一下以显示您如何利用ask,如下所示:

path("patient" / IntNumber) { index =>
  import akka.pattern.ask
  implicit val timeout = akka.util.Timeout(10 seconds)
  val fut = (fileHandlerActor ? index).mapTo[String]
  onComplete(fut){
    case util.Success(fileData) => 
      complete(HttpResponse(entity = HttpEntity(
        ContentTypes.`text/html(UTF-8)`, fileData))

    case util.Failure(ex) =>
      complete(HttpResponse(StatusCodes.InternalServerError))
  }
}

这里的假设是你的actor正在响应一个要成为HTTP响应实体的String。此外,该超时是使用ask的要求,但您可以非常轻松地在代码中的其他位置定义它,只要它在此范围内。