Scala Akka测试模拟演员自杀(使用手表)

Scala Akka测试模拟演员自杀(使用手表),scala,akka,akka-cluster,Scala,Akka,Akka Cluster,我有一个基于Akka的应用程序,它有多个参与者系统加入到集群形成中。一个参与者系统是主系统,其他参与者系统是从系统。有时,主参与者系统可能会崩溃。在这种情况下,所有从机都形成自己的集群。在我的用例中,我希望避免这种情况,并在与master的连接丢失后立即杀死所有的奴隶。为了实现这一点,我在master上添加了一个watch。下面是示例代码 class SlaveActor(input1: String, input2: String) extends Actor { .....

我有一个基于Akka的应用程序,它有多个参与者系统加入到集群形成中。一个参与者系统是主系统,其他参与者系统是从系统。有时,主参与者系统可能会崩溃。在这种情况下,所有从机都形成自己的集群。在我的用例中,我希望避免这种情况,并在与master的连接丢失后立即杀死所有的奴隶。为了实现这一点,我在master上添加了一个watch。下面是示例代码

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测试框架来测试这种行为。我尝试过不同的方法,但都不管用

注意:从参与者获取主参与者的地址作为输入参数

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)
}
}

主服务器成功地终止了自身,但不知何故未触发从属服务器终止事件。有什么帮助吗?

我发现了问题。这是一个时间问题。我的主人在我的经理能加手表之前就被杀了。我添加了一个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)
 }
}