【问题标题】:Akka actors, waiting for complete initialization issueAkka 演员,等待完成初始化问题
【发布时间】:2019-01-31 04:36:55
【问题描述】:

我的应用程序使用内部初始化其他演员(孩子)的主管 akka 演员。但是,由于它是异步执行的,因此我在尝试使用 Akka TestKit 编写测试时遇到了问题。

例如,当尝试通过向主管的子 Actor 发送消息来测试系统如何从另一个系统终止时,我创建了一个新的 Actor 系统,然后使用 actorOf 接收配置的主管(用于在主管内创建子演员),如下所示:

val anotherSystem: ActorSystem = ActorSystem("anotherSystem")

anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")

然后,如果我尝试使用actorSelection 向AnotherSupervisor 内的子actor 发送消息,则会失败,因为子actor 还不是selectable

anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver") ! message
expectMsg(Ack)

失败,因为尚未创建 AnotherManagementReceiver

使用Thread.sleep(5000) 有效,但这太糟糕了。

在寻找可能的解决方案后,我进行了测试:

anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver").resolveOne() ! message

也会因现有的 actor 消息而失败。

还尝试使用 EventFilter 来让子角色在日志中回显一些内容:

EventFilter.info("Management consumer started", occurrences = 1) intercept {
   anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")
}

这会一直等到超时(我什至看到了日志消息),但我猜 EventFilter 只是从 TestKit 创建的“主要”参与者系统中读取。

关于如何处理这种情况的任何想法或建议?

【问题讨论】:

  • 我在 actorSelection.resolveOne() 得到一个之前空了一段时间,但这似乎是一种糟糕的方式。

标签: scala akka akka-actor


【解决方案1】:

更可靠和一致的方法是让已知的参与者向您介绍更多的参与者:在这种情况下,主管是开始通信的入口点。您可以通过此 Actor 转发所有消息,也可以为子 Actor 添加一个查找协议,其他人可以向主管询问他们的 ActorRefs。

ActorSelection 仅用于远程节点之间的初始通信以获取第一个 ActorRef。从那里开始,最好只使用上述消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2015-11-24
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多