我剛剛創建了我的第一個休息服務器與AKK-HTTP。問題是我不知道如何以這種方式部署服務器,以便我可以優雅地關閉角色系統。如何優雅地停止必須部署的akka-http服務器的actor系統。
例如,我在這裏找到了一些東西:https://stackoverflow.com/a/17399574/5388513您可以使用Akka的微內核,但不推薦使用。我嘗試過使用sbt-native-package,但我不知道如何正常關閉角色系統。
謝謝!
我剛剛創建了我的第一個休息服務器與AKK-HTTP。問題是我不知道如何以這種方式部署服務器,以便我可以優雅地關閉角色系統。如何優雅地停止必須部署的akka-http服務器的actor系統。
例如,我在這裏找到了一些東西:https://stackoverflow.com/a/17399574/5388513您可以使用Akka的微內核,但不推薦使用。我嘗試過使用sbt-native-package,但我不知道如何正常關閉角色系統。
謝謝!
一種解決方案是增加一個演員你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 }
你可以添加到您的主要方法
Runtime.getRuntime.addShutdownHook(new Thread() {
override def run() {
system.shutdown()
system.awaitTermination()
}
})
您的應用程序將等待,直到演員系統將sh utt down,所有postStop
你的演員回調將被執行。
您可以添加關機鉤:
// import scala.concurrent.duration._
//shutdown Hook
scala.sys.addShutdownHook {
logger.info("Terminating...")
actorSystem.terminate()
Await.result(actorSystem.whenTerminated, 30 seconds)
logger.info("Terminated... Bye")
}
謝謝這比其他解決方案的工作要好得多,這應該不是標記爲正確。 –
如果有人想知道'秒'部分引發問題,你必須導入這個'import scala.concurrent.duration._'。 Intellij足夠愚蠢,不建議自動導入。 –