2014-03-03 4 views

Antwort

4

Ein möglicher Ansatz:

  1. eine Ausnahme Laufzeitausnahme definieren neue Klasse in der Lage die fehlerhafte Nachricht einzukapseln.
  2. Im überwachten Akteur. Fangen Sie Exceptions und werfen Sie stattdessen die oben definierte Ausnahme mit der fehlerhaften Nachricht.
  3. Erfassen Sie in der Supervisor-Strategie den neuen Ausnahmetyp und greifen Sie auf die Nachricht zu.

Zum Beispiel:

// The new exception type 
case class MessageException( 
    akkaMessage: Any, 
    originalException: Throwable 
) extends RuntimeException("Exception due to message") 

// In the supervised actor 
def receive = { 
    case msg => try{ process(msg) } catch { 
    case t => throw MessageException(msg,t) 
    } 
} 

// In the supervisor 
override val supervisorStrategy = 
    OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { 
    case MessageException(msg,t) => //decide what to do 
    } 
+2

Ja, ich kann dies tun, aber ich konnte nur die Fehlermeldung an Supervisor von catch-Block in beaufsichtigten Schauspieler senden. Ich wollte loswerden versuchen und fangen in beaufsichtigten Schauspieler wie in "Akka in Aktion" vorgeschlagen – boneash

+0

Hier hat der Versuch fangen keine Logik in sich selbst, fügen Sie einfach weitere Daten zu der Ausnahme. Eine echte Fehlerbehandlung wird weiterhin im Supervisor durchgeführt, und der try/catch-Code kann in einer Methode abstrahiert werden. – paradigmatic

+0

Paradigma Ansatz klingt Logik für mich, danke dafür. –

Verwandte Themen