2013-02-22 9 views
6

Per impostazione predefinita, Akka arresta il/i sistema/i dell'attore/i quando riceve uno SIGTERM. Come posso ignorare questo comportamento per eseguire la mia logica di arresto personalizzato prima di arrestare il sistema akka? Ho già implementato questa logica negli attori, usando speciali messaggi di interruzione aggraziati - Ho solo bisogno di invocare quella logica quando viene ricevuto il SIGTERM.Come eseguire l'arresto personalizzato su SIGTERM con Akka?

Oppure devo utilizzare un altro modo per arrestare l'applicazione? Anche questa è un'opzione.

risposta

1

Si può semplicemente utilizzare sys.shutdownHookThread come questo:

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

Sarà che sicuramente eseguito prima che il sistema attore è spento? –

+1

Non vedo alcuna documentazione che lo specifichi espressamente, ma funziona per noi. –

+3

Leggendo il codice sorgente e Javadoc, sembra che non ci sia alcuna garanzia sull'ordine in cui verranno eseguiti i hook di shutdown, quindi no, non verrà sempre eseguito al momento giusto. Ad esempio, in una versione di Java potrebbe funzionare, ma in un'altra versione, l'ordine potrebbe cambiare e potrebbe non funzionare. O i ganci di arresto potrebbero essere eseguiti contemporaneamente. –

0

Sarebbe questo 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

Il problema è che gli attori saranno stati tutti chiusi a quel punto, quindi non credo che i dati che erano al loro interno saranno più disponibili. Hmmm ... Suppongo che potrei scaricare i dati su un oggetto speciale "esterno" al sistema degli attori in postStop, e quindi prelevare i dati da lì nel callback di terminazione, ma è un po 'imbarazzante. Penso che cambiare lo script che avvia e ferma l'applicazione per usare qualcosa di diverso da SIGTERM (ad esempio un Linux fifo) sarà il modo migliore per andare qui. –