【问题标题】:Identifying an Actor using an ActorSelection使用 ActorSelection 识别 Actor
【发布时间】:2016-03-05 18:44:26
【问题描述】:

我正在写一个Actor,它应该关注另一个Actor;我们称后者为target。我的Actor 应该在其目标停止后自行停止。对于这个目标,我只有一个ActorSelection。要观看它,我显然需要ActorRef,所以我想我应该发送ActorSelectionIdentify 消息;当它回复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)]

我在这里遗漏了一些明显的东西吗?也许TestProbe 不应该透露其真实身份?我什至尝试将虚拟 Actor 实例化为 target,但结果是相同的。有什么线索吗?

【问题讨论】:

    标签: scala akka akka-testkit


    【解决方案1】:

    原来答案其实很简单:测试运行得如此之快,以至于在MyActorselection 发送Identify 消息之前,选择后面的Actor 已经收到了它的PoisonPill,因此被杀了。

    在发送 PoisonPill 之前添加一点 Thread.sleep() 可以解决问题。

    【讨论】:

      【解决方案2】:

      在发出识别请求之前,目标参与者已被终止。这是因为Akka only guarantees order when sending messages between a given pair of actors

      如果您在以下行上方添加thread.sleep,则识别请求应该成功。

      Thread.sleep(100)
      // Act
      target ! PoisonPill
      

      请注意,可能有更好的方法来编写测试代码 - 让线程休眠并不理想。

      您的观看演员还应处理目标演员的Terminated 消息,如here 所述。

      【讨论】:

        猜你喜欢
        • 2014-04-12
        • 1970-01-01
        • 2017-04-15
        • 2016-02-06
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        • 2012-03-10
        • 1970-01-01
        相关资源
        最近更新 更多