2016-03-30 26 views
1

後監控,以重新啓動它的阿卡演員我有一個演員一個會拋出一個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

這位演員似乎是頂級演員,除非您按on the guide on top-level supervisors所述實施SupervisorStrategyConfigurator,否則您無法監督。

但是,您可以自由創建使用BackoffSupervisor的演員,演員可能是頂級演員。

+0

我不確定要理解你的回答,如果我在非頂級演員內部做同樣的事情(即我啓動了一個啓動主管的演員),我沒有任何區別。 – Simon