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

Scala 如何优雅地停止必须部署的akka http服务器的actor系统。,scala,sbt,sbt-native-packager,akka-http,Scala,Sbt,Sbt Native Packager,Akka Http,我刚刚用akka http创建了我的第一个rest服务器。问题是,我不知道如何以一种可以优雅地关闭actor系统的方式部署服务器 例如,我在这里发现了一些东西:你可以使用Akka的微内核,但它已经被弃用了。我尝试使用sbt本机软件包,但我不知道如何优雅地关闭actor系统 谢谢大家! 一种解决方案是在Actor系统中添加一个Actor,用于侦听特定信号并调用shutdown: import akka.actor.{Actor, Props} object ShutdownMessage ob

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

例如,我在这里发现了一些东西:你可以使用Akka的微内核,但它已经被弃用了。我尝试使用sbt本机软件包,但我不知道如何优雅地关闭actor系统


谢谢大家!

一种解决方案是在Actor系统中添加一个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
然后您只需设置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()
  }
})

您的应用程序将等待actor系统关闭,并且actor中的所有
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")
}

谢谢你,这比其他解决方案好得多,应该改为标记正确。如果有人想知道引发问题的
部分,你必须导入此
导入scala.concurrent.duration.\u
。Intellij愚蠢到不建议自动导入。