2015-06-20 56 views
0

我继续使用喷雾,这是怎么找到的请求喷雾http请求的原始上下文中运行到同一个设计问题异步操作,做一些异步后(告诉)在阿卡操作。喷雾,阿卡和actorSelection

我使用的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(尽管我还没有明确杀死要求演员)。我已经确认它是正确的路径(即,我可以从InputJson处理程序发回任务响应)。

什么是这样做的正确的方式?我怎么能找到我的原创演员,为什么它消失了?

回答

0

您可以在ListRequest消息直接把一个ActorRef

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) 
} 
+0

感谢彼得。不幸的是,ListRequest没有回复KubernetesReply;这发生在一个始终监听消息的单独的PubSub actor中。因此,发送KubernetesReply的演员不知道InputJson的原始发件人。我能想到通过演员的参考的唯一途径是通过传递它的名字,并从Redis的(或有某种与IDS和actorRefs可变查找表的,但我宁愿避免这种情况。) – Leo

+0

@Leo也许这可能帮助:[序列化ActorRefs](http://doc.akka.io/docs/akka/snapshot/scala/serialization.html#Serializing%20ActorRefs) –