How to stop gracefully the actor system for an akka-http server that must be deployed.

前端 未结 3 1255
轻奢々
轻奢々 2020-12-19 08:03

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 syste

相关标签:
3条回答
  • 2020-12-19 08:18

    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")
    }
    
    0 讨论(0)
  • 2020-12-19 08:31

    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.

    0 讨论(0)
  • 2020-12-19 08:44

    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 }
    
    0 讨论(0)
提交回复
热议问题