2015-12-08 38 views
1

我有一個演員,作爲主管,但也需要「返回」數據給調用者,這是否是演員應該不重要。發送給發件人,從主管,如果失敗

我在問我的主管,讓我們稱他爲SV。

SV處理我發送給他的消息,併發送回應。

val system = ActorSystem("ActorSystem") 
val sv = system.actorOf(Props[SV], name = "SV") 

sv ? msg 

和SV的收到方法是這樣的:

def receive = { 
    case msg => (someChild ? msg).pipeTo(sender) 
    ... 
} 

這一切工作快活的罰款。 問題是當孩子引發異常時,這個異常被監督者策略所捕獲。

override def supervisorStrategy = OneForOneStrategy() { 
    case e : Throwable => { 
     val newResponse = someNewResponse 
     sender ! newResponse 
     ... 
    } 
} 

發送者不再對誰在第一個地方叫SV的引用,我似乎無法工作,如何將消息發送回askee,並回到我原來的流程。

回答

1

您是否使用主管策略和例外來控制流量或數據?考慮使用類型系統(Option類型或響應Future中的Failure)查找您的子actor中的「例外」情況,並無例外地處理響應流。

主管策略是針對未處理的異常。 當發生未處理的異常時,您將失去向發件人回覆消息的能力。除非您像Roland Kuhn所建議的那樣將發件人包裹在未處理的異常中。

讓管理員策略代替處理actor系統如何通過映射到Directive來響應未處理的異常。

3

這三個Actor規則之一是:「一個Actor可以發送有限數量的消息給它知道的其他Actor。」最後兩個詞在這裏非常關鍵:如果監督者沒有以某種方式被引入到原始發送者,失敗(例外)本身也不包含發件人的引用,那麼管理員不可能向發件人發送消息。您要麼捕獲孩子演員中的所有例外情況,將他們與發件人一起包裝在您自己的例外類型中,然後重新投擲,或者原始消息需要通過主管到達孩子並返回,以便主管可以看到答覆在發生故障時表現突出。

+0

我不確定我是否理解,「原來的信息需要通過主管到達孩子,然後回來」,這是不是我正在做的,當我從主管問'孩子'?它永遠不會直接返回到我問的地方,因爲發生異常,所以SupervisorStrategy會被擊中。從這裏我現在想發送一條消息給原始發件人(來自主管),有不同的迴應,如果我的問題仍然不夠清楚,我可以根據需要用流程圖進行更新。 – Kao

+0

啊,對,我沒有正確解析'ask'的用法;是的,這就是我的意思。然後,在制定supervisorStrategy時,您仍然需要在管理員中捕獲原始的'sender',這意味着管理未完成請求的數量(以免混淆)。 –