2014-01-06 41 views
1

我在akka-scala中链接演员,并且在每一步中,新创建的演员都会向主管演员发送消息。作为回应,主管会增加一个计数器。scala akka:随机deadLetters而没有演员被要求停止

我不明白为什么在这个操作过程中deadLetters是随机产生的,有时候没有deadLetters,有时我会得到几个。

此外,看起来主管不增加计数器。这是我的代码

import akka.actor._ 

object ScopeMessages{ 
    case object AddChild 
    case object Counter 
} 

class ScopeSet(n: Int) extends Actor{ 
    import ScopeMessages._ 

    var root:ActorRef = context.actorOf(Props(classOf[ScopeActor],n, self)) 

    var counter = 0 

    def receive:Receive = { 
    case AddChild => counter += 1 
    case Counter => sender ! counter 
    case _ =>() 
    } 
} 

class ScopeActor(id: Int, apex:ActorRef) extends Actor{ 
    import ScopeMessages._ 

    var sub:List[ActorRef] = Nil 

    if (id > 0){ 
    sub = context.actorOf(Props(classOf[ScopeActor], id-1, apex))::Nil 
    apex ! AddChild 
    } 

    def receive:Receive = {case _ =>()} 
} 

object ScopeTest extends App { 
    import akka.testkit.TestProbe 
    import ScopeMessages._ 

    implicit val system = ActorSystem("TestSys") 
    val p = TestProbe() 

    val n:Int = 10 
    val base_actor = system.actorOf(Props(classOf[ScopeSet], n)) 

    p.send(base_actor, Counter) 
    p.expectMsg(n) 

    system.shutdown() 
} 

感谢您的帮助。

回答

3

请记住,您在这里有一个异步系统。你在断言中没有看到正确的数字的原因是在整个演员树被创建之前正在检查计数。您可以在致电p.send之前通过休息几秒钟来验证此情况。这也可能是你在获得临时任务时的原因,因为在你有时间设置自己之前关闭系统。 apex角色可能会被终止,但仍然会收到AddChild来自正在尝试创建而正在关闭的下属的消息。

3

cmbaxter说的一切都是真的。这里有一些提示来解决它。尝试使用TestProbe的ActorRef构造ScopeSet,并向AddChild添加一个条件。在testProb收到计数器之前,也不要关闭角色系统。

class ScopeSet(n: Int, testProb: ActorRef) extends Actor{ 
    import ScopeMessages._ 

    var root:ActorRef = context.actorOf(Props(classOf[ScopeActor],n, self)) 

    var counter = 0 

    def receive:Receive = { 
    case AddChild => { 
     counter += 1 
     if (counter == n) { testProb ! counter } 
    } 
    case _ =>() 
    } 
}