2016-08-19 31 views
0

在测试程序中,我想检查一个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 
} 

这似乎很好地工作,但也是相当复杂的多读(写)...

+0

做你试试演员的正常关机,如文档http://doc.akka.io/docs/akka/current/scala/actors.html#Graceful_Stop –

+0

没有,孩子停止使用本身context.stop(个体经营)。发送给我的测试程序的终止消息应该证明该孩子实际上已停止。但是,似乎这个孩子,即使停下来,在akka平台上仍然“可见”很短时间... – Vincent

回答

0

既然你选择在parent.path/"*"上,您的parent演员可能有另一个孩子正在响应Identity消息。检查孩子停下来后接收的身份,找出其他孩子的反应。

+0

收到的身份正是孩子的身份...因此我的问题! – Vincent

+0

孩子怎么样了?你能分享一个完整的测试用例来重现这个问题吗? – thibr