Стратегии Akka и Supervisor, которые отступают

Я новичок в Akka, но мое понимание директивы Stop заключается в том, что она используется внутри директивы SupervisorStrategies, когда дочерний элемент должен считаться окончательно выведенным из строя, но есть способ справиться с полным отключением.

Если это понимание правильное, то то, что я хотел бы сделать, это иметь некоего «резервного актера», который должен быть задействован после того, как нормальный/основной дочерний элемент будет остановлен, и использоваться с этого момента в качестве запасного варианта. Например, скажем, у меня есть родительский актер, у которого есть дочерний актер — Notifier — чья работа заключается в отправке электронных писем. Если Notifier действительно умирает (скажем, базовый почтовый сервер отключается), резервной копией этого актора может быть другой актор, скажем, QueueClient, который отправляет запрос на уведомление брокеру сообщений, где сообщение будет поставлено в очередь и воспроизведено в более позднее время.

Как я могу определить такой SupervisorStrategy, чтобы внутри него была встроенная резервная копия отказоустойчивости/актора? Пожалуйста, покажите примеры кода, только так я научусь!


person smeeb    schedule 27.07.2015    source источник


Ответы (1)


Переопределение стратегий супервизора за пределы директив по умолчанию обычно не выполняется, и в вашем случае это не обязательно. Решением будет наблюдать за дочерним актором со стороны родителя, и когда родитель обнаружит, что дочерний актор остановлен, задействовать резервный актор.

импортировать akka.actor.SupervisorStrategy.Stop импортировать 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 _ => }
}
person mattinbits    schedule 27.07.2015