使用Spray,Akka和actorSelection进行异步操作

时间:2015-06-20 13:24:02

标签: scala akka spray

我使用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处理程序发回任务响应)。

这是什么样的正确模式?我怎样才能找到我原来的演员,为什么它会消失?

1 个答案:

答案 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)
}