斯卡拉阿卡:随机死信,而没有演员被要求停止



我在 akka-scala 中链接 actor,在每一步中,新创建的 actor 都会向主管 actor 发送一条消息。作为响应,主管将增加一个计数器。

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

感谢您的帮助。

请记住,这里有一个异步系统。 您在断言中看不到正确计数的原因是,在创建整个参与者树之前,正在检查计数。 您可以通过在调用 p.send 之前将睡眠时间置于几秒钟来验证这一点。 这也可能是您在系统有时间设置之前关闭系统时收到死信的原因。 apex执行组件可能已终止,但仍会收到来自下属的AddChild消息,这些消息在关闭时尝试创建。

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

相关内容

  • 没有找到相关文章

最新更新