Akka 如何在依赖于其他参与者的情况下响应请求?

Akka 如何在依赖于其他参与者的情况下响应请求?,akka,akka-http,Akka,Akka Http,这可能是一个愚蠢的问题,但我需要问,因为我还没有找到答案。我使用了akka http with routing,其典型的路由模式是带有 完成一个HttpRequest 例如: ~ path("reactJS") { complete( HttpResponse(entity = HttpEntity(ContentTypes.`text/html(UTF-8)`, Source.fromFile(reactJS).mkString)) ) } 但是,我希望有一个单独的参与者来处

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

例如:

~ path("reactJS") {
  complete(
    HttpResponse(entity = HttpEntity(ContentTypes.`text/html(UTF-8)`, Source.fromFile(reactJS).mkString))
  )
}
但是,我希望有一个单独的参与者来处理文件系统,然后,在我看来,我希望服务器将请求传递给文件处理程序参与者。所以我的问题是,一个人如何自然地完成一个依赖于另一个参与者的请求?我猜服务器将有一个如下所示的路由:

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

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

}
请求的服务必须是服务器的接收方法,对吗


查看:

我认为最好的办法是使用ask模式(
),然后在路由树中使用
onComplete
指令来处理ask返回的
未来。以您的示例为例,稍作修改以展示如何利用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))
  }
}

这里的假设是您的参与者正在使用一个字符串进行响应,该字符串将成为HTTP响应实体。另外,该超时是使用ask的一个要求,但是您可以很容易地在代码的其他地方定义它,只要它在这里的范围内。

我认为您最好的选择是使用ask模式(
)然后在路由树中使用
onComplete
指令处理从ask返回的
未来
。以您的示例为例,稍作修改以展示如何利用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))
  }
}

这里的假设是您的参与者正在使用一个字符串进行响应,该字符串将成为HTTP响应实体。另外,该超时是使用ask的一个要求,但是您可以在代码的其他地方很容易地定义它,只要它在这里的范围内。

我想我在将其复制为工作代码时遇到了问题(未指定的值参数:data:Source[ByteString,Any])您不需要编写onComplete(fut)吗?@stian,是的,u是正确的,我在没有检查编译的情况下做了所有这些更改。我现在向
onComplete
添加了正确的调用。抱歉。想弄明白这一点其实也很有趣:)我想我在把它作为工作代码复制时遇到了问题(未指定的值参数:data:Source[ByteString,Any])你不需要写onComplete(fut)吗?@stian,是的,你是对的,我在没有检查编译的情况下做了所有这些更改。我现在向
onComplete
添加了正确的调用。对不起,想弄明白也很有趣:)