scala play:如何在自动重建时杀死旧的actor / threads?

时间:2013-08-10 19:25:39

标签: scala playframework actor

我有一个播放应用程序,我正在使用那些做一些持续工作/监控的演员。

e.g。

class MyActor extends Actor {
    def act() { while(true) { /* work */ } }
}

在我的代码中我完全启动了这个演员一次 我的问题是,无论何时播放自动重建应用程序(由于源更改),它将创建一个新的Actor,但不会摆脱旧的actor。 如果使用线程(包括守护程序线程)而不是actor进行监视,则会发生完全相同的事情。

有没有办法在自动重建时杀死旧的actor / threads,或者确保只存在一个actor(我已经尝试将actor线程设为object,但这并没有除了手动重启应用程序之外(我在每次更改时重新启动应用程序都自动完成)?

此外,在播放中是否有更好的后台监控模式(显然是不会创建非结束线程的模式)。

由于

1 个答案:

答案 0 :(得分:3)

您可以定义Global object来监听应用程序事件(必须在默认包中定义):

import play.api.GlobalSettings

object Global extends GlobalSettings {

  override def onStart(application: play.api.Application) {
    println("Starting actors")
    MyActorSystem
  }

  override def onStop(application: play.api.Application) {
    println("Stopping actors")
    MyActorSystem.system.shutdown()
  }
}

重新加载时会触发停止和启动事件。 如果您正在使用Play的内部演员系统,我认为您可以使用它:

play.api.libs.concurrent.Akka.system.shutdown()