问题
I just created my first rest server with akka-http. The problem is that I do not know how to deploy the server in such a way that I could gracefully shutdown the actor system.
For example I found something here: https://stackoverflow.com/a/17399574/5388513 where you could use Akka's microkernel, but it is deprecated. I tried using sbt-native-package, but I do not know how to gracefully shutdown the actor system.
Thank you!
回答1:
You can add shutdown hook:
// import scala.concurrent.duration._
//shutdown Hook
scala.sys.addShutdownHook {
logger.info("Terminating...")
actorSystem.terminate()
Await.result(actorSystem.whenTerminated, 30 seconds)
logger.info("Terminated... Bye")
}
回答2:
You could add to your main method
Runtime.getRuntime.addShutdownHook(new Thread() {
override def run() {
system.shutdown()
system.awaitTermination()
}
})
Your app will wait until actor system will be shutt down and all postStop
callbacks in your actors will be executed.
回答3:
One solution is to add an Actor to your ActorSystem that listens for a particular signal and calls 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
Then you simply setup your 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 }
来源:https://stackoverflow.com/questions/33481156/how-to-stop-gracefully-the-actor-system-for-an-akka-http-server-that-must-be-dep