最近我将使用Akka Actors的Play应用程序更改为经典的Scala应用程序。使用Play,我会覆盖应用程序的全局设置,如下所示:
import play.api._
import play.api.Play.current
object Global extends GlobalSettings {
var system: ActorSystem = _
override def onStart(app: Application) : Unit = {
super.onStart(app)
Logger.info("onStart")
system = ActorSystem("SysActor")
override def onStop(app: Application) : Unit = {
super.onStop(app)
if (system != null) {
system.terminate
Logger.info(system + " shutdown !")
}
}
}
在经典的scala应用程序中,我定义了一个要在sbt run
命令执行的主类,但它是否可以检测正在运行的应用程序的关闭或停止,如Play Scala
?请注意,我使用Docker在Amazon EC2上发布了该应用程序。
答案 0 :(得分:1)
一种方法是注册一个关闭钩子,例如:
object MyApp {
val system = ActorSystem("SysActor") // instantiation can be moved to main
private val t = new Thread {
override def run() = {
if (system != null) {
system.terminate
Logger.info(system + " shutdown !")
}
}
}
Runtime.getRuntime.addShutdownHook(t)
def main(args: Array[String]): Unit = { ... }
}
当JVM获得关闭信号时,会调用关闭挂钩(虽然请注意它不是guaranteed,具体取决于信号)