У меня есть актер, который иногда может бросить Exception
как это одна:Как контролировать актер Akka для того, чтобы перезапустить его после 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")
Но когда исключение актер не перезапускается. (Это ведет себя так же, если я использую onStop
вместо onFailure
).
Что я делаю неправильно?
Я не уверен, что понял ваш ответ, если я делаю то же самое внутри актера на высшем уровне (т. Е. Я начинаю актер, который запускает супервизор), я не понимаю. – Simon