Scala 如何监视Akka参与者,以便在异常后重新启动它

Scala 如何监视Akka参与者,以便在异常后重新启动它,scala,akka,actor,Scala,Akka,Actor,我有一个演员有时会抛出一个异常,如下所示: 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

我有一个演员有时会抛出一个
异常
,如下所示:

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 _ =>
  }
}
我想在出现
异常时重新启动它。
为了做到这一点,我做了以下工作(如上所述):

但是当抛出异常时,参与者不会重新启动。(如果我使用
onStop
而不是
onFailure
,其行为方式与此相同)


我做错了什么?

这个演员似乎是一个顶级演员,除非你按照规定实施了一个计划,否则你无法监督


但是,您可以在一个参与者中使用BackoffSupervisor自由创建一个参与者,该参与者可以是顶级参与者。

此参与者似乎是顶级参与者,除非您按照说明实现了一个


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

我不确定是否理解您的回答,如果我在非顶级演员中做了相同的事情(即,我启动了一个启动主管的演员),我不会有任何区别。我不确定是否理解您的回答,如果我在一个非顶级演员身上做了同样的事情(即,我让一个演员扮演主管),我不会有任何不同。
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")