我有一个基于Akka的应用程序,它在群集形成中加入了多个actor系统。 1个演员系统是Master,其他是Slaves。有时,主演员系统崩溃可能会发生。在这种情况下,所有的奴隶形成自己的集群。在我的用例中,我希望避免这种情况,并在与master的连接丢失后立即终止所有从属服务器。为了实现这一点,我在master上添加了一个手表。这是示例代码。
class SlaveActor(input1: String, input2: String) extends Actor {
.....
.....
context.actorSelection(MASTER_ACTOR_ADDRESS) ! Identify(1)
....
def receive = {
case ActorIdentity(arg1, actorRef)=>
actorRef.foreach(context.watch(_))
case Terminated(actorRef) =>
self ! PoisonPill
.......
.......
}
......
}
}
这一切都按预期工作,但现在我想使用Akka测试框架测试此行为。我尝试了不同的东西,但它不起作用。
注意:slave actor获取master的地址作为输入参数。
describe("master slave tests") {
it("slave should kill itself as soon as master is down") {
val dummyActor = system.actorOf(Props.empty)
master = system.actorOf(Props(classOf[MasterActor], TestProbe().ref, dummyActor), "context-supervisor")
slave = system.actorOf(
Props(classOf[SlaveActor], dummyActor, s"${master.path.address.toString}${master.path.toStringWithoutAddress}"))
val masterProbe = TestProbe()
masterProbe.watch(master)
val slaveProbe = TestProbe()
slaveProbe.watch(slave)
// NOTE: Simulating master DOWN
master ! akka.actor.PoisonPill
masterProbe.expectTerminated(master)
slaveProbe.expectTerminated(slave)
}
}
Master成功杀死了自己,但不会以某种方式终止slave Terminated事件。有什么帮助吗?
答案 0 :(得分:1)
我发现了问题。这是一个时间问题。在我的经理能够添加手表之前,我的主人被杀了。我添加了一个Thread.sleep()来等待初始化。之后,我收到所有消息,包括终止经理。
describe("master slave tests") {
it("slave should kill itself as soon as master is down") {
val dummyActor = system.actorOf(Props.empty)
master = system.actorOf(Props(classOf[MasterActor],
TestProbe().ref, dummyActor), "context-supervisor")
slave = system.actorOf(
Props(classOf[SlaveActor], dummyActor, s"${master.path.address.toString}${master.path.toStringWithoutAddress}"))
val masterProbe = TestProbe()
masterProbe.watch(master)
val slaveProbe = TestProbe()
slaveProbe.watch(slave)
Thread.sleep(2000)
// NOTE: Simulating master DOWN
master ! akka.actor.PoisonPill
masterProbe.expectTerminated(master)
slaveProbe.expectTerminated(slave)
}
}