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