我有一个播放应用程序,我正在使用那些做一些持续工作/监控的演员。
e.g。
class MyActor extends Actor {
def act() { while(true) { /* work */ } }
}
在我的代码中我完全启动了这个演员一次 我的问题是,无论何时播放自动重建应用程序(由于源更改),它将创建一个新的Actor,但不会摆脱旧的actor。 如果使用线程(包括守护程序线程)而不是actor进行监视,则会发生完全相同的事情。
有没有办法在自动重建时杀死旧的actor / threads,或者确保只存在一个actor(我已经尝试将actor线程设为object
,但这并没有除了手动重启应用程序之外(我在每次更改时重新启动应用程序都自动完成)?
此外,在播放中是否有更好的后台监控模式(显然是不会创建非结束线程的模式)。
由于
答案 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()