2013-02-22 17 views
6

Standardmäßig beendet Akka die Actor-Systeme, wenn es eine SIGTERM empfängt. Wie kann ich dieses Verhalten außer Kraft setzen, um meine benutzerdefinierte Abschaltlogik vor dem Herunterfahren des akka-Systems auszuführen? Ich habe diese Logik bereits in den Aktoren implementiert, indem ich spezielle anmutige Stop-Nachrichten verwende - ich muss diese Logik nur aufrufen, wenn die SIGTERM empfangen wird.Wie kann man benutzerdefiniertes Herunterfahren auf SIGTERM mit Akka durchführen?

Oder muss ich eine andere Möglichkeit zum Herunterfahren der Anwendung verwenden? Das ist auch eine Option.

Antwort

1

Sie können nur sys.shutdownHookThread wie folgt verwenden:

def main(args: Array[String]) { 
    ... initialization code ... 
    sys.shutdownHookThread { 
    println "Shutting down ..." 
    shutdownHandler ! DoSomething 
    } 
} 
+0

Wird das auf jeden Fall laufen, bevor der Schauspieler System heruntergefahren wird? –

+1

Ich sehe keine Dokumentation, die das ausdrücklich sagt, aber es funktioniert für uns. –

+3

Beim Lesen des Quellcodes und des Javadoc sieht es so aus, als gebe es keine Garantie für die Reihenfolge, in der Shutdown-Hooks ausgeführt werden, also nein, es wird nicht immer zur richtigen Zeit ausgeführt. Zum Beispiel könnte es in einer Version von Java funktionieren, aber in einer anderen Version könnte sich die Reihenfolge ändern und es könnte nicht funktionieren. Oder die Shutdown-Hooks können gleichzeitig ausgeführt werden. –

0

Würde dies fit: http://doc.akka.io/api/akka/2.1.0/#akka.actor.ActorSystem

 
abstract def 
registerOnTermination(code: Runnable): Unit 
Register a block of code (callback) to run after ActorSystem.shutdown has been issued and all actors in this actor system have been stopped. Multiple code blocks may be registered by calling this method multiple times. The callbacks will be run sequentially in reverse order of registration, i.e. last registration is run first. 
Exceptions thrown 
a 
RejectedExecutionException if the System has already shut down or if shutdown has been initiated. 


abstract def 
registerOnTermination[T](code: ⇒ T): Unit 
Register a block of code (callback) to run after ActorSystem.shutdown has been issued and all actors in this actor system have been stopped. Multiple code blocks may be registered by calling this method multiple times. The callbacks will be run sequentially in reverse order of registration, i.e. last registration is run first. 
Exceptions thrown 
a 
RejectedExecutionException if the System has already shut down or if shutdown has been initiated. 


+0

Das Problem ist, dass die Schauspieler zu diesem Zeitpunkt alle heruntergefahren wurden, also glaube ich nicht, dass die Daten, die in ihnen waren, nicht mehr verfügbar sind. Hmmm ... Ich nehme an, ich könnte die Daten an ein spezielles Objekt "außerhalb" des Actor-Systems in postStop ausgeben und dann die Daten von dort im Terminierungs-Callback abholen, aber das ist irgendwie peinlich. Ich denke, das Ändern des Skripts, das die Anwendung startet und stoppt, um etwas anderes als SIGTERM (z. B. ein Linux-Fifo) zu verwenden, wird der beste Weg sein, hier zu gehen. –

Verwandte Themen