我繼續使用噴霧,這是怎麼找到的請求噴霧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處理程序發回任務響應)。
什麼是這樣做的正確的方式?我怎麼能找到我的原創演員,爲什麼它消失了?
感謝彼得。不幸的是,ListRequest沒有回覆KubernetesReply;這發生在一個始終監聽消息的單獨的PubSub actor中。因此,發送KubernetesReply的演員不知道InputJson的原始發件人。我能想到通過演員的參考的唯一途徑是通過傳遞它的名字,並從Redis的(或有某種與IDS和actorRefs可變查找表的,但我寧願避免這種情況。) – Leo
@Leo也許這可能幫助:[序列化ActorRefs](http://doc.akka.io/docs/akka/snapshot/scala/serialization.html#Serializing%20ActorRefs) –