Ein möglicher Ansatz:
- eine Ausnahme Laufzeitausnahme definieren neue Klasse in der Lage die fehlerhafte Nachricht einzukapseln.
- Im überwachten Akteur. Fangen Sie Exceptions und werfen Sie stattdessen die oben definierte Ausnahme mit der fehlerhaften Nachricht.
- 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
}
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
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
Paradigma Ansatz klingt Logik für mich, danke dafür. –