2012-09-07 10 views
5

He escrito el código de ejemplo que inicia a un actor, lo mata y termina la ejecución.terminan correctamente los actores de Akka en 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 
    } 
} 

Este código imprime:

[info] prestart 
[info] poststop 

Pero se niega a parar hasta que mato el proceso con Ctrl-C

Lo que sí esperar solicitud de? ¿Cómo puedo detenerlo de manera adecuada?

+2

La documentación de Akka podría ayudar donde dice 'context.stop' en http://doc.akka.io/api/akka/2.0.3/#akka.actor.Actor. –

Respuesta

8

Tal vez hacer una llamada a ActorSystem.shutdown() haría el truco.

De acuerdo con la akka docs:

abstracta def shutdown(): Unit

sistema Stop a este actor. Esto detendrá al actor guardián, que a su vez detendrá recursivamente a todos sus actores secundarios, luego al guardián del sistema (por debajo del cual residen los actores de la explotación maderera) y ejecutará a todos los manejadores de terminación registrados (consulte ActorSystem.registerOnTermination).

+1

Tenga en cuenta: [a partir de Akka 2.4] (http://doc.akka.io/docs/akka/snapshot/project/migration-guide-2.3.x-2.4.x.html#Actor_system_shutdown) debe usar 'ActorSystem .terminate() '. Esto devuelve un 'Futuro [Terminado]' que posiblemente podría esperar. – 203

Cuestiones relacionadas