我有一个演员,有时会抛出一个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
),它的行为方式相同。
我做错了什么?
答案 0 :(得分:0)
这名演员似乎是一名顶级演员,除非你按照SupervisorStrategyConfigurator的规定实施on the guide on top-level supervisors,否则你无法监督。
但是,您可以在演员中使用BackoffSupervisor创建演员,这可能是顶级演员。