1

私は Akka を初めて使用しますが、ディレクティブについての私の理解では、子が永久にサービスを停止していると見なされるべきときに内部で使用されますが、完全な停止を処理する方法があります。StopSupervisorStrategies

その理解が正しければ、私がやりたいことは、通常/プライマリの子が停止され、その時点からフォールバックとして使用された後に従事する必要がある、ある種の「バックアップ アクター」を持つことです。たとえば、Notifier電子メールを送信する子アクターを持つ親アクターがいるとします。Notifierが本当に停止した場合(たとえば、基盤となるメール サーバーがオフラインになった場合)、このアクターへのバックアップは別のアクター (たとえば、 ) である可能性があります。このアクターQueueClientは通知要求をメッセージ ブローカーに送信し、そこでメッセージはキューに入れられ、後で再生されます。時間。

SupervisorStrategy内部にフォールト トレランス/アクター バックアップが組み込まれているように定義するにはどうすればよいですか? コード例を見せてください。それが私が学ぶ唯一の方法です!

4

1 に答える 1

1

デフォルトのディレクティブを超えてスーパーバイザー戦略をオーバーライドすることは一般的に行われておらず、実際には必要ありません。解決策は、親から子アクターを監視し、親が子が停止していることに気付いたら、バックアップ アクターを関与させることです。

import akka.actor.SupervisorStrategy.Stop import akka.actor._

class Parent extends Actor {

  var child: ActorRef = context.actorOf(Props[DefaultChild])
  context.watch(child)

  def receive = {
    case Terminated(actor) if actor == child => 
      child = context.actorOf(Props[BackupChild])
  }

  override def supervisorStrategy = OneForOneStrategy() {
    case ex: IllegalStateException => Stop
  }
}

class DefaultChild extends Actor {

  def receive = { case _ => throw new IllegalStateException("whatever") }
}

class BackupChild extends Actor {

  def receive = { case _ => }
}
于 2015-07-27T11:21:54.200 に答える