2012-09-07 5 views
5

Ho scritto codice di esempio che avvia un attore, lo uccide e termina l'esecuzione.terminano correttamente gli attori akka in scala

object PureAkka { 
    def main(argv : Array[String]) = { 
    val actorSystem : ActorSystem = ActorSystem("main") 
    val actor : ActorRef = actorSystem.actorOf(Props(new Actor { 
     override def receive = { 
     case x => println(x) 
     } 
     override def preStart() = println("prestart") 
     override def postStop() = println("poststop") 
    })) 
    Thread.sleep(15000) 
    actor ! PoisonPill 
    } 
} 

Questo codice stampa:

[info] prestart 
[info] poststop 

Ma rifiuta di fermarsi fino a quando uccido il processo con Ctrl-C

Cosa significa applicazione attendere? Come posso fermarlo in modo corretto?

+2

La documentazione di Akka può aiutare dove dice 'context.stop' in http://doc.akka.io/api/akka/2.0.3/#akka.actor.Actor. –

risposta

8

Forse fare una chiamata a ActorSystem.shutdown() farebbe il trucco.

Secondo il akka docs:

astratto def shutdown(): Unit

stop sistema di questo attore. Questo fermerà l'attore custode, che a sua volta interromperà in modo ricorsivo tutti i suoi attori figli, quindi il custode del sistema (al di sotto del quale risiedono gli attori di registrazione) e eseguirà tutti i gestori di terminazioni registrati (vedi ActorSystem.registerOnTermination).

+1

Nota: [come da Akka 2.4] (http://doc.akka.io/docs/akka/snapshot/project/migration-guide-2.3.x-2.4.x.html#Actor_system_shutdown) dovresti usare 'ActorSystem .terminate() '. Questo restituisce un 'Futuro [Terminato] che potresti aspettare. – 203