2016-03-30 7 views
1

У меня есть актер, который иногда может бросить 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).

Что я делаю неправильно?

ответ

0

Этот актер, кажется, является актером верхнего уровня, которого вы не можете контролировать, если не используете SupervisorStrategyConfigurator, как указано on the guide on top-level supervisors.

Тем не менее, вы можете создать актера, используя BackoffSupervisor внутри актера, который может быть на верхнем уровне.

+0

Я не уверен, что понял ваш ответ, если я делаю то же самое внутри актера на высшем уровне (т. Е. Я начинаю актер, который запускает супервизор), я не понимаю. – Simon