2013-02-22 2 views
6

По умолчанию Akka выключает актерскую систему (ы), когда получает SIGTERM. Как я могу переопределить это поведение, чтобы выполнить свою пользовательскую логику выключения, прежде чем выключать систему akka? У меня уже есть эта логика, реализованная в актерах, используя специальные грациозные сообщения остановки - мне просто нужно вызвать эту логику при получении SIGTERM.Как сделать пользовательское выключение на SIGTERM с помощью Akka?

Или мне нужно использовать другой способ отключения приложения? Это также вариант.

ответ

1

Вы можете просто использовать sys.shutdownHookThread так:

def main(args: Array[String]) { 
    ... initialization code ... 
    sys.shutdownHookThread { 
    println "Shutting down ..." 
    shutdownHandler ! DoSomething 
    } 
} 
+0

Будет ли это определенно работать до того, как система актер закрыли? –

+1

Я не вижу никакой документации, которая специально говорит об этом, но она работает для нас. –

+3

Читая исходный код и Javadoc, похоже, что нет гарантии относительно порядка, в котором будут запускаться крючки остановки, поэтому нет, он не всегда будет работать в нужное время. Например, в одной версии Java это может сработать, но в другой версии порядок может измениться, и он может не работать. Или, крюки остановки могут запускаться одновременно. –

0

ли это нужным: http://doc.akka.io/api/akka/2.1.0/#akka.actor.ActorSystem

 
abstract def 
registerOnTermination(code: Runnable): Unit 
Register a block of code (callback) to run after ActorSystem.shutdown has been issued and all actors in this actor system have been stopped. Multiple code blocks may be registered by calling this method multiple times. The callbacks will be run sequentially in reverse order of registration, i.e. last registration is run first. 
Exceptions thrown 
a 
RejectedExecutionException if the System has already shut down or if shutdown has been initiated. 


abstract def 
registerOnTermination[T](code: ⇒ T): Unit 
Register a block of code (callback) to run after ActorSystem.shutdown has been issued and all actors in this actor system have been stopped. Multiple code blocks may be registered by calling this method multiple times. The callbacks will be run sequentially in reverse order of registration, i.e. last registration is run first. 
Exceptions thrown 
a 
RejectedExecutionException if the System has already shut down or if shutdown has been initiated. 


+0

Проблема в том, что все актеры будут закрыты к этому моменту, поэтому я не думаю, что данные, которые были внутри них, будут доступны уже больше. Хм ... Полагаю, я мог бы сбросить данные на специальный объект «за пределами» актерской системы в postStop, а затем получить данные оттуда в обратном вызове завершения, но это неловко. Я думаю, что изменить сценарий, который запускает и останавливает приложение на использование чего-то другого, кроме SIGTERM (например, Linux fifo), будет самым простым способом перейти сюда. –

Смежные вопросы