播放应用程序生命周期

时间:2016-10-31 09:08:31

标签: scala playframework-2.0

最近我将使用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上发布了该应用程序。

1 个答案:

答案 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,具体取决于信号)