我正在写一个Actor
应该看另一个的Actor
;让我们称后者为目标。一旦它的目标停止,我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
化为目标,但结果是相同的。有什么线索吗?