我的应用使用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系统中读取。
关于如何处理这种情况有什么想法或建议吗?
答案 0 :(得分:1)
一种更可靠,更一致的方法是让知名演员向您介绍更多演员:在这种情况下,主管是交流开始的切入点。您既可以通过该Actor转发所有消息,也可以为子Actor添加查找协议,其他人可以在其中向主管询问其ActorRefs。
ActorSelection仅用于远程节点之间的初始通信以获得第一个ActorRef。从那里开始,最好只使用如上所述的消息。