2017-05-06 4 views
0

Ich bin sehr neu zu Akka und ich hatte die folgende Frage:Akka Supervisor-Strategie für Router

ich einen MasterActor haben, wo ein Router definiert ist, und das ist, wo ich die supervisionStrategy definiert:

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

ich ging dann diese supervisionStrategy an den Router:

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

ich eine print-Anweisung in der postRestart Methode gelegt, und ich sehe, dass nur ein Schauspieler neu gestartet wird. Dies ließ mich glauben, dass ich auf dem richtigen Weg war.

aber ich habe 2 Fragen so weit:

Ausgabe # 1:

Ich bemerkte, dass Absender deadLetters in der print-Anweisung ist. Ich habe erwartet, dass es der gescheiterte Schauspieler ist.

Issue # 2:

Ich habe eine print-Anweisung in der postRestart Methode, und ich sah, dass nur ein routee neu gestartet wird, wenn eine FileNotFound Ausnahme auftritt und die Verarbeitung der fortsetzt. Das scheint das richtige Verhalten zu sein.

Allerdings, wenn ich die SupervisorStrategy in Stop auf der FileNotFound Ausnahme ändern, (siehe unten), sehe ich, dass ALLE Akteure stoppen und ich überhaupt keine Verarbeitung stattfindet. Ich habe erwartet, dass die Verarbeitung von allen Akteuren durchgeführt wird, bis eine FileNotFound-Ausnahme auftritt. Wenn der fehlgeschlagene Akteur die FileNotFound-Ausnahme trifft, dachte ich, dass NUR dieser Akteur gestoppt werden sollte und die anderen die Verarbeitung fortsetzen sollten.

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

Antwort

0

In Bezug auf Problem # 1: das wird erwartet. Die sender() Sie hier anrufen, ist die im Rahmen Ihrer MasterActor. Es ist nur erlaubt, diese Methode während der Nachrichtenverarbeitung aufzurufen, daher ist das Verhalten in diesem Beispiel nicht definiert. (Der Verweis auf deadLetters hier ist verwirrend, dies wurde in Version 2.5.1 von Akka verbessert)

In Bezug auf Frage # 2 bin ich nicht ganz sicher, ich vermute, es hat damit zu tun, dass Sie ' Umwickeln die RoundRobinPool in einer RemoteRouterConfig aber ich bin nicht so vertraut mit diesem Teil des Systems.

Verwandte Themen