Scala 如何优雅地停止必须部署的akka http服务器的actor系统。
我刚刚用akka http创建了我的第一个rest服务器。问题是,我不知道如何以一种可以优雅地关闭actor系统的方式部署服务器 例如,我在这里发现了一些东西:你可以使用Akka的微内核,但它已经被弃用了。我尝试使用sbt本机软件包,但我不知道如何优雅地关闭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
谢谢大家! 一种解决方案是在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愚蠢到不建议自动导入。