3

次のコードがあります。

class A extends Actor with ActorLogging {
  override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 2) { 
    case _ => log.info("An actor has been killed"); Restart 
  }

  val b = context.system.actorOf(Props[B], "b")

  def receive = {
    case _ => context.system.scheduler.schedule(5 seconds, 5 seconds, b, true)
  }
}

class B extends Actor with ActorLogging {
  def receive = { case true => self ! Kill }
}

self ! KillアクターのインスタンスでA「アクターが殺されました」というメッセージが表示されず、その後のアクターへの呼び出しで「Aデッド レター」メッセージが生成されるため、再起動されませんでした。OneForOneStrategyが呼び出されない のはなぜですか?

オーバーライド全体を削除するだけOneForOneStrategyで、プログラムの動作にまったく変更がないという点で奇妙です。

4

2 に答える 2

3

アクター「B」を同時に再起動し、再起動すると例外がスローされます。コードから を削除self ! trueしますpostRestart。そうでなければ、何が起こると思いますか? 無限に再帰的な再起動ループに送信しています。

これを説明するために表示されている順序またはアクションは次のとおりです。

  1. アクター「A」を作成
  2. アクター「B」を作成
  3. trueAに送る
  4. trueBに送る
  5. 「B」はtrueメッセージで例外をスローします
  6. 「A」が「B」を再開
  7. 再起動後、「B」が自分自身を送信しますtrue
  8. 手順 5 を繰り返します
于 2014-03-27T14:54:35.260 に答える