2016-06-22 9 views
0

私は2つの俳優、親と子供がいます。親はcontent.watch(子)を使用して子を監視します。子がcontext.stop(self)を呼び出すと、親はTerminatedメッセージを受け取ります。しかし、子が例外をスローすると、akkaはそれを再起動しますが、親にTerminatedメッセージを送信しません。Akka死亡監視 - 終了と再開のために見てください

親アクターはどのように子を監視し、終了/再起動を監視できますか?私はそれを理解

class Parent ... { 
    override val supervisorStrategy = OneForOneStrategy() { 
    case _: Exception => Stop 
    } 
} 

ように、これは、この俳優のすべての子に適用されます:私が思いついた

1つのオプションは、すべての例外で停止するように、親でスーパーバイザ戦略を上書きすることです。理想的には私は、個々の子ども(俳優の種類)ごとに異なるスーパーバイザ戦略を持っているしたいと思いますので、私は動作しますが、それはハックのビットのように思える

class Child ... { 
    override def postRestart(reason: Throwable): Unit = context.stop(self) 
} 

を使用することを考えました。私が気付いていない他の選択肢はありますか?

多くの感謝!

答えて

0

私はどの俳優あたりのタイプの監修モデルを知っているが、何頭に浮かぶことはあなたが子役で例外をキャッチし、封筒にそれをラップする可能性があることですしていない。

try { 
    ... 
} catch { 
    case e: Throwable => throw new DontRestartMeException(e) 
} 

あるいはさらに簡単に手動で例外をスローした場合は、ラップされたものを直接スローしてください。

そして親に例外タイプごとに決める:

override val supervisorStrategy = OneForOneStrategy() { 
    case e: DontRestartMeException => Stop 
    case _: Exception => Restart 
} 
+0

おかげで、私はこのアイデアを見てみましょう –

関連する問題