2016-10-31 7 views
0

Недавно я изменил приложение 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 !") 
    } 
    } 
} 

В классическом применении лестницы, я определил основной класс будет выполняться при sbt run команде, но это способ обнаружения, как Play Scala, в закрыть или остановить запущенное приложение? Обратите внимание, что я опубликовал приложение на Amazon EC2 с помощью Docker.

ответ

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 = { ... } 

}  

Shutdown крюки вызывается, когда виртуальная машина получает сигнал останова (хотя заметим, что это не guaranteed, в зависимости от сигнала)

+0

Значит, вызов 'addShutdownHook' неявно закрывает актерскую систему моего приложения? – alifirat

+0

Нет, извините - я не был понятен - ваша реализация метода 'run' в потоке, который вы передаете' addShutdownHook', должна делать все, что нужно сделать при выключении; В вашем случае он должен называть 'system.terminate' –

+0

О, хорошо, спасибо за пример :) – alifirat

 Смежные вопросы

  • Нет связанных вопросов^_^