0

次のシナリオがあります。親スーパーバイザー アクターは、コンストラクターで渡されたファクトリ (関数) を使用して、メッセージごとに子を作成します。

class supervisorActor(childActorMaker: ActorRefFactory => ActorRef)
  extends Actor with ActorLogging{

  def receive: Receive = {

    case "testThis" =>
      val childActor = childActorMaker(context)
      childActor!"messageForChild"
  }

  override val supervisorStrategy =
    OneForOneStrategy() {
      case _ => Stop
   }
}

class childActor extends Actor  {
   def receive:Receive = {
      case _ => /** whatever **/
   }
}

テストでは、子の Receive をオーバーライドして例外を強制します。私の期待は、私が設定した監督戦略のために毎回子役が止められることです。

"When the child Actor throws an exception the Supervisor Actor " should " " +
    " stop it" in {

    val childActorRef = TestActorRef(new childActor() {
      override def receive = {
        case msg: String => throw new IllegalArgumentException("kaboom")
      }
    })
    watch(childActorRef)

    val maker = (_: ActorRefFactory) => childActorRef
    val supervisorActorRef = system.actorOf(Props(new supervisorActor(maker)))

    supervisorActorRef!"testThis"

    expectTerminated(childActorRef, 1.second)
}

SupervisorStrategy Stop により、子アクターが停止されることを期待します。代わりに、次のエラーが表示されます。

java.lang.AssertionError: assertion failed: timeout (1 second) during expectMsg: Terminated

なぜこれが起こっているのですか?ありがとうございました

4

1 に答える 1

3

のコンテキスト (テスト コードで作成したあなたの ActorContext を意味します) で が作成されてchildActorRefいないようです。したがって、テスト コードでは、 childActor( ) は SupervisorActor( ) の子ではありません。そのため、のスーパーバイザー戦略は目的を果たせません。supervisorActorRefsupervisorActorchildActorRefsupervisorActorRefsupervisorActor

于 2016-01-30T19:10:01.457 に答える