2016-10-31 215 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

相關問題