6

我刚刚用 akka-http 创建了我的第一个休息服务器。问题是我不知道如何以可以优雅地关闭参与者系统的方式部署服务器。

例如,我在这里找到了一些东西:https ://stackoverflow.com/a/17399574/5388513你可以在其中使用 Akka 的微内核,但它已被弃用。我尝试使用 sbt-native-package,但我不知道如何优雅地关闭 actor 系统。

谢谢!

4

3 回答 3

31

您可以添加关闭挂钩:

// import scala.concurrent.duration._
//shutdown Hook
scala.sys.addShutdownHook {
  logger.info("Terminating...")
  actorSystem.terminate()
  Await.result(actorSystem.whenTerminated, 30 seconds)
  logger.info("Terminated... Bye")
}
于 2015-11-10T19:31:34.897 回答
4

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

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

您的应用程序将等到演员系统关闭并且postStop演员中的所有回调都将被执行。

于 2015-11-03T18:41:39.690 回答
1

一种解决方案是向您的 ActorSystem 添加一个 Actor 来监听特定信号并调用关闭:

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 }
于 2015-11-03T14:04:01.727 回答