2013-02-22 4 views
6

デフォルトでは、AkkaはSIGTERMを受け取ったときにアクターシステムをシャットダウンします。どうすればakkaシステムをシャットダウンする前に、この動作を無効にしてカスタムシャットダウンロジックを実行できますか?私はすでに特別な優雅な停止メッセージを使ってこのロジックを俳優に実装しています。SIGTERMが受け取られたら、そのロジックを呼び出すだけです。AkkaでSIGTERMのカスタムシャットダウンを行う方法は?

また、他の方法でアプリケーションをシャットダウンする必要がありますか?これもオプションです。

答えて

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など)を使用するようにアプリケーションを起動および停止するスクリプトを変更することは、ここに行くための最もきれいな方法になると考えています。 –

関連する問題