如何监视Akka actor以便在异常后重新启动它

时间:2016-03-30 12:38:17

标签: scala akka actor

我有一个演员,有时会抛出一个Exception作为这个:

import akka.actor._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

class MonitorActor extends Actor with ActorLogging {

  context.system.scheduler.schedule(initialDelay = 0.seconds, interval = 3.seconds) {
    val r = Math.random()
    if (r > 0.8) throw new Exception
    else log info "missed"
  }

  def receive = {
    case _ =>
  }
}

我想在Exception发生时重新启动它 为了做到这一点,我已经这样做了(正如here所述):

val system = ActorSystem("scheduler")

val monitorActorProps = Props(classOf[MonitorActor])

val supervisor = BackoffSupervisor.props(
  Backoff.onFailure(
    monitorActorProps,
    childName = "error-actor",
    minBackoff = 1.seconds,
    maxBackoff = 12.seconds,
    randomFactor = 0.2
  ))

system.actorOf(supervisor, name = "echoSupervisor")

但是当抛出异常时,actor不会重启。 (如果我使用onStop而不是onFailure),它的行为方式相同。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

这名演员似乎是一名顶级演员,除非你按照SupervisorStrategyConfigurator的规定实施on the guide on top-level supervisors,否则你无法监督。

但是,您可以在演员中使用BackoffSupervisor创建演员,这可能是顶级演员。