Akka 演员,等待完成初始化问题
Akka actors, waiting for complete initialization issue
我的应用程序使用内部初始化其他演员 (childs) 的 Supervisor akka 演员。但是,由于它是异步执行的,因此我在尝试使用 Akka TestKit 编写测试时遇到问题。
例如,当试图通过向主管的 child 演员发送消息来测试一个系统如何从另一个系统终止时,我创建了一个新的演员系统,然后使用 actorOf 一个主管接收一个配置(用于在主管内部创建 child actors),如下所示:
val anotherSystem: ActorSystem = ActorSystem("anotherSystem")
anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")
然后,如果我尝试使用 actorSelection 向 AnotherSupervisor
内的 child 演员发送消息,它会失败,因为 child 演员尚未 selectable
:
anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver") ! message
expectMsg(Ack)
失败,因为尚未创建 AnotherManagementReceiver
。
使用 Thread.sleep(5000)
可行,但这太糟糕了。
在搜索了可能的解决方案后,我测试了:
anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver").resolveOne() ! message
也因现有演员消息而失败。
还尝试通过 EventFilter 获取 child 参与者在日志中回显的内容:
EventFilter.info("Management consumer started", occurrences = 1) intercept {
anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")
}
然后一直等到超时(我什至看到了日志消息),但我猜 EventFilter 只从 TestKit 创建的 "main" actor 系统中读取。
关于如何处理这种情况有什么想法或建议吗?
更可靠和一致的方法是让知名演员向您介绍更多演员:在这种情况下,主管是沟通的入口点。您可以通过此 actor 转发所有消息,也可以为子 actor 添加查找协议,其他人可以向主管询问他们的 ActorRefs。
ActorSelection 仅用于远程节点之间的初始通信以获得第一个 ActorRef。从那里开始,只使用如上所述的消息会好得多。
我的应用程序使用内部初始化其他演员 (childs) 的 Supervisor akka 演员。但是,由于它是异步执行的,因此我在尝试使用 Akka TestKit 编写测试时遇到问题。
例如,当试图通过向主管的 child 演员发送消息来测试一个系统如何从另一个系统终止时,我创建了一个新的演员系统,然后使用 actorOf 一个主管接收一个配置(用于在主管内部创建 child actors),如下所示:
val anotherSystem: ActorSystem = ActorSystem("anotherSystem")
anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")
然后,如果我尝试使用 actorSelection 向 AnotherSupervisor
内的 child 演员发送消息,它会失败,因为 child 演员尚未 selectable
:
anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver") ! message
expectMsg(Ack)
失败,因为尚未创建 AnotherManagementReceiver
。
使用 Thread.sleep(5000)
可行,但这太糟糕了。
在搜索了可能的解决方案后,我测试了:
anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver").resolveOne() ! message
也因现有演员消息而失败。
还尝试通过 EventFilter 获取 child 参与者在日志中回显的内容:
EventFilter.info("Management consumer started", occurrences = 1) intercept {
anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor")
}
然后一直等到超时(我什至看到了日志消息),但我猜 EventFilter 只从 TestKit 创建的 "main" actor 系统中读取。
关于如何处理这种情况有什么想法或建议吗?
更可靠和一致的方法是让知名演员向您介绍更多演员:在这种情况下,主管是沟通的入口点。您可以通过此 actor 转发所有消息,也可以为子 actor 添加查找协议,其他人可以向主管询问他们的 ActorRefs。
ActorSelection 仅用于远程节点之间的初始通信以获得第一个 ActorRef。从那里开始,只使用如上所述的消息会好得多。