【问题标题】:Akka - test supervision strategyAkka——测试监督策略
【发布时间】:2016-01-28 12:58:31
【问题描述】:

我有以下场景:父主管actor使用构造函数中传递的工厂(函数)为每条消息创建一个子节点。

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

我希望子actor会因为 supervisorStrategy Stop 而停止。 相反,我得到了这个错误:

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

知道为什么会这样吗?谢谢

【问题讨论】:

    标签: scala akka akka-testkit akka-supervision


    【解决方案1】:

    似乎childActorRef 不是使用supervisorActorRef 的上下文创建的(我的意思是您在测试代码中创建的supervisorActor 的ActorContext)。 所以 childActor(childActorRef) 在您的测试代码中不是 supervisorActor(supervisorActorRef) 的孩子。这就是为什么supervisorActor 的主管策略不起作用的原因。

    【讨论】:

    • 这正是原因所在。我实现了一个简单的工厂来将孩子创建为 context.actorOf 并观察它 - 完美运行。谢谢@ulas!
    猜你喜欢
    • 2015-11-14
    • 2018-03-17
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多