6

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!

Community
  • 1
  • 1
Emanuel Lal
  • 61
  • 1
  • 4

3 Answers3

31

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")
}
Mariusz Nosiński
  • 1,308
  • 9
  • 10
  • Thank you this worked much better than other solutions, this should be marked correct instead. – Surendra Bobba Apr 26 '17 at 12:17
  • If anyone is wondering about the `seconds` part throwing an issue, you have to import this `import scala.concurrent.duration._`. Intellij is stupid enough not to suggest auto import for it. – Greedy Coder Aug 28 '17 at 13:49
4

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.

hveiga
  • 6,725
  • 7
  • 54
  • 78
kardapoltsev
  • 1,053
  • 8
  • 14
1

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 }
Ramón J Romero y Vigil
  • 17,373
  • 7
  • 77
  • 125