2015-11-02 2 views
4

Я только что создал свой первый сервер отдыха с akka-http. Проблема в том, что я не знаю, как развернуть сервер таким образом, чтобы я мог изящно отключить систему актеров.Как прекратить изящную актерскую систему для сервера akka-http, который должен быть развернут.

Например, я нашел что-то здесь: https://stackoverflow.com/a/17399574/5388513, где вы могли бы использовать микроядро Akka, но оно устарело. Я попытался использовать sbt-native-package, но я не знаю, как изящно закрыть систему актеров.

Спасибо!

ответ

1

Одним из решений является добавление актера к вашему ActorSystem, который прослушивает для конкретного сигнала и вызывает отключение:

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 } 
2

Вы можете добавить свой файл основной метод

Runtime.getRuntime.addShutdownHook(new Thread() { 
    override def run() { 
    system.shutdown() 
    system.awaitTermination() 
    } 
}) 

Ваше приложение будет ждать, пока система актеров будет sh utt down и все postStop обратные вызовы в ваших актерах будут выполнены.

20

Вы можете добавить выключение крючок:

// 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

Если кто-то задается вопросом о том, что часть 'seconds' выбрасывает проблему, вам нужно импортировать этот' import scala.concurrent.duration._'. Intellij достаточно глуп, чтобы не предлагать автопорт для него. –