2015-06-20 77 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) –