2016-10-31 131 views
0

最近,我将使用Akka Actor的Play应用程序更改为经典的Scala应用程序。一起玩,我重写应用程序的全局设置是这样的:播放应用程序生命周期

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

一种方式做这将是注册一个关闭挂钩,是这样的:

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,根据信号)

+0

因此,对'addShutdownHook'的调用隐式关闭了我的应用程序的actor系统? – alifirat

+0

不,对不起 - 我不清楚 - 你传递给'addShutdownHook'的线程中'run'方法的实现应该在关闭时执行任何需要的操作;在你的情况下,它应该叫'system.terminate' –

+0

非常感谢这个例子:) – alifirat

相关问题