我使用spray继续遇到相同的设计问题,这是在Akka中执行一些异步(tell)操作后如何找到Spray http请求的原始上下文。
我正在使用Net-a-Porter actor per request model。它创建了一个子actor,我指定它来处理每个请求,该请求由另一个持有正确请求上下文的actor封装。
让我们调用我的演员ActorA,它有这个接收方法:
def receive: Receive = {
case v : InputJson =>
val id = createId
val redisList = context.actorOf(Props[RedisListActor])
// At this point, sender is the 'per-request' actor created, which has the HTTP context of the Spray request.
redisList ! ListRequest(id, sender.path.toStringWithoutAddress, v)
这是将输入添加到redis上的作业队列,该队列在另一台服务器上使用。完成此作业后,另一台服务器会将结果添加到我们订阅的Redis PubSub队列中。当一个项进入此队列时,它会警告我的ActorA(使用context.actorOf)。
case kr : KubernetesReply =>
context.system.actorSelection(kr.actorPath) ! TaskResponse("Success", kr.payload, kr.id)
你可以看到我试图通过使用它的actorPath找到原始发件人,但是在KubernetesReply上,我发现路径是deadLetters(即使我没有明确地杀死请求actor)。我已经确认它是正确的路径(即我可以从InputJson处理程序发回任务响应)。
这是什么样的正确模式?我怎样才能找到我原来的演员,为什么它会消失?
答案 0 :(得分:0)
您可以将ActorRef
直接放在ListRequest
消息中。
case class ListRequest(id: YourIdType, requestActor: ActorRef, json: InputJson)
def receive: Receive = {
case v : InputJson =>
val id = createId
val redisList = context.actorOf(Props[RedisListActor])
redisList ! ListRequest(id, sender, v)
case kr : KubernetesReply =>
kr.requestActor ! TaskResponse("Success", kr.payload, kr.id)
}