如何优雅地停止必须部署的akka​​-http服务器的actor系统.

Ema*_*Lal 5 scala sbt sbt-native-packager akka-http

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

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

谢谢!

Mar*_*ski 29

你可以添加关机钩子:

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


Ram*_*gil 1

一种解决方案是向 ActorSystem 添加一个 Actor,用于侦听特定信号并调用 shutdown:

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
Run Code Online (Sandbox Code Playgroud)

然后你只需设置你的 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 }
Run Code Online (Sandbox Code Playgroud)