2012-09-07 50 views
5

我已經編寫了啓動演員的示例代碼,將其殺死並完成執行。正確地終止了scala中的akka​​演員

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 
    } 
} 

此代碼打印:

[info] prestart 
[info] poststop 

但它拒絕停止,直到我殺了使用Ctrl-C

是什麼應用程序等待的過程?我怎樣才能以適當的方式來阻止它?

+2

Akka文檔可能有助於說明位於http://doc.akka.io/api/akka/2.0.3/#akka.actor.Actor的「context.stop」。 –

回答

8

也許打電話給ActorSystem.shutdown()會做伎倆。

按照akka docs

抽象高清shutdown(): Unit

停止這個演員系統。這將阻止監護者actor,這反過來將遞歸地停止其所有的子actor,然後是系統監護人(記錄執行者所在的系統守護程序)以及執行所有註冊的終止處理程序(請參閱ActorSystem.registerOnTermination)。

+1

請注意:[從Akka 2.4開始](http://doc.akka.io/docs/akka/snapshot/project/migration-guide-2.3.x-2.4.x.html#Actor_system_shutdown),您應該使用ActorSystem .terminate()'。這會返回一個'Future [Terminated]'你可能會等待。 – 203