2013-04-19 10 views
6

Was passiert, wenn ein Akteur einer Zukunft eine Ausnahme auslöst?Akka Futures Exceptions

Nach der Akka Dokumentation bei http://doc.akka.io/docs/akka/snapshot/scala/futures.html:

Es spielt keine Rolle, ob ein Schauspieler oder der Disponent die Zukunft abgeschlossen wird, wenn eine Ausnahme die Zukunft gefangen wird, wird sie enthalten stattdessen eines gültigen Ergebnis. Wenn ein Future eine Exception enthält, wird das Aufrufen von Await.result dazu führen, dass es erneut ausgelöst wird, so dass es richtig behandelt werden kann.

Ich bin nicht sicher, ob dies ist, was ich zu sehen bin, wenn dieses Stück Code ausgeführt wird:

class Worker extends Actor { 
    def receive = { 
     case i: Int => throw new RuntimeException 
    }   
    } 

    implicit val system = ActorSystem("MySystem") 
    val worker = system.actorOf(Props(new Worker), name="worker") 
    implicit val timeout = Timeout(5 minutes) 
    val future = worker ? 0 
    val res = Await.result(future, 10 seconds) 

Gemäß der Dokumentation sollte Await.result wieder die Ausnahme werfen, aber was ich bekommen ist eine TimeoutException! Kann jemand dazu etwas sagen?

Antwort

14

Für Schauspieler müssen Sie die Ausnahme und return it as a failure status fangen. Gerade jetzt sind Sie nichts an den Absender zurückkehrt, so dass Sie eine Timeout-Ausnahme bekommen:

class Worker extends Actor { 
    def receive = { 
    case i: Int => { 
     try { 
     throw new RuntimeException 
     sender ! "Some good result" 
     } catch { 
     case e: Exception => 
      sender ! akka.actor.Status.Failure(e) // Alert the sender of the failure 
      throw e // Alert any supervisor actor of the failure 
     } 
    } 
    } 
} 

Futures verarbeiten kann dies ein wenig mehr anmutig, da sie immer ein Ergebnis senden, während Akteure nicht (dies würde Sie das gleiche Ergebnis wie oben):

val future = Future { 
    throw new RuntimeException 
    } 
+0

Danke für die Klarstellung. Die Verbindung, die Sie zur Verfügung gestellt haben, ist auch gut in der Klärung der Interaktion zwischen Akteuren und Futures. Ich frage mich, ob Sie aufgrund Ihres Verständnisses meinen obigen Hinweis auf Futures genau genug finden, um diese Beziehung zu klären? – deepkimo

+0

Nein, ich wünschte, die Dokumentation wäre besser. Das Problem ist, dass die Akteure nicht davon ausgehen, dass sie etwas an den Absender zurücksenden, so dass Sie nie wissen, ob eine Anfrage abgeschlossen sein sollte. Es wäre schön, wenn dies besser dokumentiert wäre, oder wenn Anfragen einfach eliminiert würden und ein vollständig typisierter Send-Empfangs-Aktor-Mechanismus implementiert wurde. Die Ambiguität untypisierter Akteure wird nur noch durch die Ambiguität untypisierter und völlig unbekannter Antwortmöglichkeiten verschlimmert. – Noah

+0

Ist das notwendig? 'werfen e // Alarmieren Sie jeden Supervisor des Fehlers. Angenommen, der Fehler ist auf ein "falsches Passwort" für einen Login-Akteur zurückzuführen. Würde Throw dem Vorgesetzten helfen? – Jus12