2015-11-02 75 views
4

我剛剛創建了我的第一個休息服務器與AKK-HTTP。問題是我不知道如何以這種方式部署服務器,以便我可以優雅地關閉角色系統。如何優雅地停止必須部署的akka​​-http服務器的actor系統。

例如,我在這裏找到了一些東西:https://stackoverflow.com/a/17399574/5388513您可以使用Akka的微內核,但不推薦使用。我嘗試過使用sbt-native-package,但我不知道如何正常關閉角色系統。

謝謝!

回答

1

一種解決方案是增加一個演員你ActorSystem偵聽特定的信號,並調用關機:

import akka.actor.{Actor, Props} 

object ShutdownMessage 

object KillSwitchActor { 
    def props : Props = Props[KillSwitchActor] 
} 

class KillSwitchActor extends Actor { 
    def receive = { 
    case ShutdownMessage => context.system.shutdown() 
    case _ => {} 
    } 
}//end class KillSwitchActor 

然後你只需設置你的KillSwitchActor:

import akka.actor.ActorSystem 

val actorSystem : ActorSystem = ActorSystem("testKillSwitch") 

val killRef = actorSystem actorOf KillSwitchActor.props 

//"Say hello to my little friend!" - Tony Montana 
if(someTerminatingCondition) { killRef ! ShutdownMessage } 
2

你可以添加到您的主要方法

Runtime.getRuntime.addShutdownHook(new Thread() { 
    override def run() { 
    system.shutdown() 
    system.awaitTermination() 
    } 
}) 

您的應用程序將等待,直到演員系統將sh utt down,所有postStop你的演員回調將被執行。

20

您可以添加關機鉤:

// import scala.concurrent.duration._ 
//shutdown Hook 
scala.sys.addShutdownHook { 
    logger.info("Terminating...") 
    actorSystem.terminate() 
    Await.result(actorSystem.whenTerminated, 30 seconds) 
    logger.info("Terminated... Bye") 
} 
+0

謝謝這比其他解決方案的工作要好得多,這應該不是標記爲正確。 –

+0

如果有人想知道'秒'部分引發問題,你必須導入這個'import scala.concurrent.duration._'。 Intellij足夠愚蠢,不建議自動導入。 –