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!
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")
}
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.
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 }