为什么Identify消息在终止后在actor选择中找到一个actor?

时间:2016-08-19 07:23:56

标签: scala akka

在测试程序中,我想检查一个Actor(child)是否仍然被终止,并且在计算之后不再创建。我的测试看起来像(它是TestKit子类的一部分):

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,Some( parent.path / child-name ))而不是预期的消息。这意味着,即使在收到Terminated消息(由expectTerminated(...)测试产生)之后,将Identify消息发送给actor选择也不一定会导致ActorIdentity(...,None)响应。

有人知道akka框架实际上做了什么以及它在这种情况下是如何工作的?在此先感谢您的帮助!

与此同时,我将测试的最后一行替换为:

val identities = receiveWhile() {
  case ActorIdentity(1, Some(ref)) => ref == child
}
if (identities.isEmpty) {
  expectMsg(ActorIdentity(1, None))
} else {
  expectNoMsg
}

似乎工作得很好,但读取(和写入)却相当复杂......

1 个答案:

答案 0 :(得分:0)

由于您选择的是parent.path / "*",因此您的parent演员可能有另一个孩子正在回复Identity消息。检查停止孩子后收到的身份,以确定其他孩子的反应。