首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ActorSelection识别行为者

使用ActorSelection识别行为者
EN

Stack Overflow用户
提问于 2016-03-05 18:44:26
回答 2查看 492关注 0票数 0

我正在编写一个应该监视另一个ActorActor;让我们将后者称为目标。一旦目标停止,我的Actor就应该停止。对于这个目标,我只有一个ActorSelection。为了观看它,我显然需要一个ActorRef,所以我想我应该向ActorSelection发送一个Identify消息;当它用ActorIdentity回复时,我将得到它的ActorRef。到目前为止还不错,但我无法让它开始工作。

这是规范:

代码语言:javascript
运行
复制
// 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,details跳过):

代码语言:javascript
运行
复制
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()

现在,当我运行我的测试时,它是绿色的,因为被测试的系统确实被停止了。但问题是,它停止了自己,因为它无法找到它的目标使用上述步骤。日志文件说:

请求目标选择ActorSelectionAnchor(akka://default/)、路径(/system/testProbe-3)来标识自己;messageId=871823258 无法找到请求的目标ActorSelectionAnchor(akka://default/)、路径(/system/testProbe-3)

我是不是漏掉了什么明显的东西?也许TestProbe不应该透露它的真实身份?我甚至尝试将虚拟Actor实例化为目标,但结果是一样的。有线索吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-05 19:12:17

结果,答案其实很简单:测试运行得如此之快,以至于在MyActorIdentify消息发送到selection之前,所选内容背后的Actor已经收到了它的PoisonPill,因此被杀死了。

在发送之前添加一点Thread.sleep()PoisonPill修复了这个问题。

票数 0
EN

Stack Overflow用户

发布于 2016-03-05 19:15:39

在发出标识请求之前,目标参与者将被终止。这是因为Akka只保证在给定的一对参与者之间发送消息时的顺序。

如果在下面的行前面添加了一个thread.sleep,则标识请求将成功。

代码语言:javascript
运行
复制
Thread.sleep(100)
// Act
target ! PoisonPill

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

您的监视参与者还应该处理目标参与者的Terminated消息,正如这里所描述的那样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35818260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档