Akka演员,等待完整的初始化问题

时间:2018-08-24 16:56:18

标签: scala akka akka-actor

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

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

f2

然后,如果我尝试使用actorSelection向--Create min Select a.f1 ,a.f2 ,b.min_quant ,a.rate As min_rate Into t1_min From t1 As a Inner Join ( Select f1 ,f2 ,MIN(quant) As min_quant From t1 Group By f1, f2 ) As b On a.f1 = b.f1 And a.f2 = b.f2 And a.quant = b.min_quant --Create Max Select a.f1 ,a.f2 ,b.max_quant ,a.rate As max_rate Into t1_max From t1 As a Inner Join ( Select f1 ,f2 ,MAX(quant) As max_quant From t1 Group By f1, f2 ) As b On a.f1 = b.f1 And a.f2 = b.f2 And a.quant = b.max_quant --Create Final Select a.f1 ,a.f2 ,a.quant ,b.min_quant ,c.max_quant ,a.rate ,b.min_rate ,c.max_rate From t1 As a Left Join t1_min As b On a.f1 = b.f1 And a.f2 = b.f2 Left Join t1_max As c On a.f1 = c.f1 And a.f2 = c.f2 中的子actor发送消息,则由于该子actor尚未val anotherSystem: ActorSystem = ActorSystem("anotherSystem") anotherSystem.actorOf(Props(classOf[Supervisor], new ConfigurationFromStatic(configsAnother), metrics), "AnotherSupervisor") 而失败:

AnotherSupervisor

失败,因为尚未创建selectable

使用anotherSystem.actorSelection("/user/AnotherSupervisor/AnotherManagementReceiver") ! message expectMsg(Ack) 可行,但这很糟糕。

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

AnotherManagementReceiver

也由于现有的参与者消息而失败。

还尝试使用EventFilter来获取子角色在日志中回显的内容:

Thread.sleep(5000)

那一直等到超时(我什至看到日志消息),但是我猜想EventFilter只从TestKit创建的“主” actor系统中读取。

关于如何处理这种情况有什么想法或建议吗?

1 个答案:

答案 0 :(得分:1)

一种更可靠,更一致的方法是让知名演员向您介绍更多演员:在这种情况下,主管是交流开始的切入点。您既可以通过该Actor转发所有消息,也可以为子Actor添加查找协议,其他人可以在其中向主管询问其ActorRefs。

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