我在编写Actor
,应该看另一个Actor
;让我们称后者为目标。一旦其目标停止,我的Actor
应该停止。对于这个目标,我只有一个ActorSelection
。要看它,我显然需要一个ActorRef
,所以我想我应该发送ActorSelection
一个Identify
消息;当它回复与ActorIdentity
我会有它的ActorRef
。到目前为止这么好,但我无法让它工作。使用ActorSelection识别演员
这里的规格:
// 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 [锚(阿卡://默认/),路径(/系统/ testProbe-3)]
我失去的东西在这里很明显?也许TestProbe
不应该透露它的真实身份?我甚至试图通过实例化一个虚拟Actor
为目标但结果是相同的。任何线索?