scala akka:随机deadLetters而没有要求演员停下来

时间:2014-01-06 14:29:24

标签: scala akka concurrent-programming

我在akka-scala中链接演员,每一步,新创建的演员都会向主管演员发送消息。作为回应,主管将增加一个柜台。

我不明白为什么在此操作中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()
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

请记住,这里有一个异步系统。您没有在断言中看到正确计数的原因是在创建整个actor树之前正在检查计数。您可以通过在呼叫p.send之前暂停几秒钟来验证这一点。这也可能是你获得动物的原因,因为你在有时间自行设置之前关闭了系统。 apex actor可能已被终止,但仍在接收来自正在关闭时尝试创建的下属的AddChild条消息。

答案 1 :(得分:3)

cmbaxter所说的一切都是真的。这里有一些解决方法的提示。尝试使用TestProbe的ActorRef构建ScopeSet,并为您接收AddChild添加条件。在testProb收到计数器之前,也不要关闭actor系统。

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 _ => ()
  }
}