2017-05-06 50 views
0

我很新的阿卡,我有以下問題:阿卡主管戰略路由器

我在那裏一個路由器定義一個MasterActor而這正是我所定義的supervisionStrategy:

override val supervisorStrategy = OneForOneStrategy() { 
case _: FileNotFoundException => 
println("****** Failed actor in FileNotFound: " + sender) 
Restart 
} 

然後我通過這個supervisionStrategy到路由器:

val router = context.actorOf(RemoteRouterConfig(RoundRobinPool(3, supervisorStrategy=supervisorStrategy), addresses).props(Props(classOf[MapActor], reduceActor)), "router") 

我把打印語句在postRestart方法,我看到只有一個演員重新啓動。這使我相信我走在了正確的軌道上。

不過,我有2個問題至今:

問題#1:

我注意到,發件人在打印語句deadLetters。我預計它會成爲失敗的演員。

問題2:

我把打印語句在postRestart方法,我看到,在遇到FileNotFound異常,當只有一個routee重啓和的繼續處理。這似乎是正確的行爲。但是,如果我將SupervisorStrategy更改爲StopNotFound異常(如下所示),我會看到所有actor都停下來,並且我根本沒有進行任何處理。我希望所有參與者都能看到處理過程,直到遇到FileNotFound異常。當失敗的演員擊中FileNotFound異常時,我認爲只有該演員應該停止,其他人應該繼續處理。

override val supervisorStrategy = OneForOneStrategy() { 
case _: FileNotFoundException => 
println("****** Failed actor in FileNotFound: " + sender) 
Stop 
} 

回答

0

關於問題#1:這是預期的。您在此打的sender()是您的MasterActor環境中的一個。只允許在消息處理期間調用此方法,因此此示例中的行爲未定義。 (這裏引用deadLetters令人困惑,這在Akka 2.5.1版本中得到了改進)

關於問題#2,我不太確定,我懷疑它與事實有關,重新包裝RoundRobinPoolRemoteRouterConfig,但我不熟悉系統的這一部分。