2014-07-25 3 views
5

Während ich Code innerhalb eines Aktors ausführe, muss ich prüfen, ob der Aktor noch lebt. Wäre das ratsam oder gibt es einen besseren Weg?Überprüfen, ob ein Scala/Akka-Aktor beendet ist

if (self != akka.actor.DeadLetter) { 
    // do something 
} 

Vielen Dank!

EDIT ---

Vielen Dank für Ihre Eingaben. Was passiert, ist folgendes. Ich benutze Play. Wenn mein Akteur startet, wird nach einer eingehenden Anfrage ein Timeout geplant.

Manchmal wird der Aktor aus anderen Gründen gestoppt, bevor das Zeitlimit abläuft (z. B. wenn der Client die Verbindung trennt). In diesem Fall, was ich sehe dann in den Protokollen ist

Actor[akka://application/deadLetters], timeout expired. 

Zu meinem Verständnis bedeutet dies, dass die Standard deadLetters Schauspieler, dass Code ausgeführt wird. Meine Frage ist also wirklich: Was ist der beste Weg zu überprüfen, ob der Promise-Code ausgeführt wird, nachdem der Akteur beendet wurde, und zu verhindern, dass er weitergeht, wenn das der Fall ist?

Antwort

0

Wenn Ihr Schauspieler tot ist, wird kein Code innerhalb des Actors ausgeführt.

Sie können prüfen, ob ein bestimmter Akteur verfügbar ist, mit actorSelection, und dann eine Nachricht an alles senden, was als Ergebnis zurückgegeben wird (wenn es nichts gibt, wird keine Nachricht gesendet).

ActorContext.actorSelection(<your-actor-name>) ! someMessage 
+0

Danke für Ihre Antwort. Können Sie sich meine Fragenbearbeitung ansehen? Es erklärt besser das Problem, berücksichtigt Ihre Bemerkung über den Code in toten Schauspielern. – ticofab

+0

Hallo Fabio :) Sie könnten versuchen, etwas mit postStop für diesen Schauspieler zu tun, wie der andere Autor vorgeschlagen (dies ist die Methode, die aufgerufen werden sollte, wenn die Schauspieler beendet). Zum Beispiel, senden Sie eine Nachricht an einen anderen (beobachtenden) Akteur, der den Kontext verändern würde? Oder verwenden Sie eine andere externe Synchronisierung. – Ashalynd

0

Ich denke, Sie können Ihren Schauspieler sehen und wenn Sie die Nachricht Terminated erhalten, sind Sie sicher, dass Ihr Schauspieler nicht läuft.

ActorContext.watch(self) 
+0

Die Art, wie ich diese Informationen verwenden könnte, wäre, einen Zustand im Akteur zu setzen und diesen Zustand in meiner if-Anweisung zu überprüfen. Die if-Anweisung wird irgendwann an einem bestimmten Punkt ausgeführt (in einem Play-Promise-Timeout). Ich würde lieber einen saubereren Weg benutzen, wenn es welche gibt. – ticofab

+0

Während das Beobachten der bevorzugte Weg ist, um benachrichtigt zu werden, wenn ein Akteur gestoppt wurde, hilft es nicht, die Tatsache zu erkennen, dass er innerhalb des Schauspielers stoppt. –

+0

Können Sie erklären, was genau ein 'ActorContext' ist? Danke –

2

Sie sollten sich mit dem Schauspieler-Lebenszyklus vertraut machen: http://doc.akka.io/docs/akka/2.3.4/scala/actors.html#Actor_Lifecycle

Von innen Schauspieler können Sie die Poststop() Rückruf implementieren, die direkt vor dem Schauspieler genannt werden wird gestoppt werden. Wenn Sie den Lebenszyklus des Akteurs von einem anderen Akteur überwachen möchten, sollten Sie DeathWatch verwenden: http://doc.akka.io/docs/akka/2.3.4/scala/actors.html#Lifecycle_Monitoring_aka_DeathWatch

+0

Danke für deine Antwort.Der Code wird tatsächlich im DeadLetter-Actor ausgeführt. Ich habe die Frage bearbeitet, um mehr Kontext zu geben. – ticofab