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")