テストプログラム内で、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(...)
テストの結果として)Terminatedメッセージを受信した後でも、Identifyメッセージをアクター選択に送信しても必ずしもActorIdentity(...、None)応答が返されるわけではありません。
誰かがakkaフレームワークが実際に何を行い、この場合どのように動作するのかを知っていますか?あなたの助けを前もってありがとう!正常に動作するようですが、読んで(と書き込み)することは非常に複雑です
val identities = receiveWhile() {
case ActorIdentity(1, Some(ref)) => ref == child
}
if (identities.isEmpty) {
expectMsg(ActorIdentity(1, None))
} else {
expectNoMsg
}
...
docs http://doc.akka.io/docs/akka/current/scala/actors.html#Graceful_Stop –
のように、アクターの正常なシャットダウンを試みましたか?子供はcontext.stop(self )。私のテストプログラムに送られたTerminatedメッセージは、その子が実際に停止していることを証明しなければなりません。しかし、子供は、たとえ停止していても、短期間にakkaプラットフォームで「目に見える」ままであるようです... – Vincent