私はActor
別のものを見なければならない を書いていActor
ます。後者をtargetと呼びましょう。Actor
ターゲットが停止すると、自分自身を停止する必要があります。このターゲットには、ActorSelection
. それを見るには、明らかに が必要なので、メッセージActorRef
を送信する必要があると考えました。それが返信すると、私はその. ここまでは順調ですが、うまくいきません。ActorSelection
Identify
ActorIdentity
ActorRef
仕様は次のとおりです。
// Arrange
val probe = TestProbe()
val target = TestProbe().ref
val sut = system.actorOf(MyActor.props(system.actorSelection(target.path)), "watch-target")
probe watch sut
// Act
target ! PoisonPill
// Assert
probe.expectTerminated(sut)
そして実装(FSM
詳細は省略):
log.debug("Asking target selection {} to identify itself; messageId={}", selection.toString(), messageId)
selection ! Identify(messageId)
when(Waiting) {
case Event(ActorIdentity(`messageId`, Some(ref)), Queue(q)) =>
log.info("Received identity for remote target: {}", ref)
context.watch(ref)
goto(NextState) using TargetFound(ref)
case Event(ActorIdentity(`messageId`, None), Queue(q)) =>
log.error("Could not find requested target {}", selection.toString())
stop()
}
initialize()
テストを実行すると、テスト中のシステムが実際に停止しているため、緑色になります。しかし、問題は、前述の手順を使用してターゲットを見つけることができないため、停止することです。ログファイルには次のように記載されています。
ターゲットの選択 ActorSelection[Anchor(akka://default/), Path(/system/testProbe-3)] にそれ自体を識別するように依頼します。messageId=871823258
要求されたターゲット ActorSelection [Anchor(akka://default/), Path(/system/testProbe-3)] が見つかりませんでした
ここで明らかな何かが欠けていますか?多分 aTestProbe
はその正体を明かすべきではありませんか? ダミーActor
をターゲットとしてインスタンス化してみましたが、結果は同じです。どんな手掛かり?