在测试程序中,我想检查一个Actor(child
)是否保持终止状态,并且在一些计算后不会再次创建。我的测试样子(这是一个TestKit子类别的一部分):为什么Identify消息在终止后会在演员选择中找到演员?
val childSelection = system.actorSelection(parent.path/"*")
childSelection ! Identify(0)
val child = expectMsgPF {
case ActorIdentity(0, Some(ref)) => ref
}
watch(child)
// some computation that should end in stopping child
expectTermiated(child)
// some computation that should not create a new child
childSelection ! Identify(1)
expectMsg(ActorIdentity(1, None))
最后一行有时会意外失败,说明该消息ActorIdentity(1,有些(parent.path /儿童名称))是收到而不是预期的。这意味着,即使在收到终止消息(由expectTerminated(...)
测试产生)之后,将标识消息发送给演员选择不一定会导致ActorIdentity(...,None)响应。
有没有人知道akka框架实际上做了什么以及它在这种情况下如何工作?在此先感谢您的帮助!
同时,我代替我的测试与最后一行:
val identities = receiveWhile() {
case ActorIdentity(1, Some(ref)) => ref == child
}
if (identities.isEmpty) {
expectMsg(ActorIdentity(1, None))
} else {
expectNoMsg
}
这似乎很好地工作,但也是相当复杂的多读(写)...
做你试试演员的正常关机,如文档http://doc.akka.io/docs/akka/current/scala/actors.html#Graceful_Stop –
没有,孩子停止使用本身context.stop(个体经营)。发送给我的测试程序的终止消息应该证明该孩子实际上已停止。但是,似乎这个孩子,即使停下来,在akka平台上仍然“可见”很短时间... – Vincent