如何响应依赖于另一个参与者的请求?
how to respond to a request with a dependency on another actor?
这可能是一个愚蠢的问题,但我需要问一下,因为我还没有找到答案。我使用带有路由的 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
}
并且请求的服务必须是服务器接收方法中的一个案例,对吧?
调查:
我认为最好的办法是使用询问模式 (?
),然后在路由树中使用 onComplete
指令来处理从问。以您的示例为例,对其进行一些修改以显示如何利用 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 的要求,但您可以很容易地在代码的其他地方定义它,只要它在此处的范围内即可。
这可能是一个愚蠢的问题,但我需要问一下,因为我还没有找到答案。我使用带有路由的 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
}
并且请求的服务必须是服务器接收方法中的一个案例,对吧?
调查:
我认为最好的办法是使用询问模式 (?
),然后在路由树中使用 onComplete
指令来处理从问。以您的示例为例,对其进行一些修改以显示如何利用 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 的要求,但您可以很容易地在代码的其他地方定义它,只要它在此处的范围内即可。