在測試程序中,我想檢查一個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