点赞-测试监督策略
Akka - test supervision strategy
我有以下场景:父主管 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)
}
我希望儿童演员会因为 supervisorStrategy Stop 而停止。
相反,我收到此错误:
java.lang.AssertionError: assertion failed: timeout (1 second) during expectMsg: Terminated
知道为什么会这样吗?谢谢
似乎 childActorRef
不是用 supervisorActorRef
的上下文创建的(我的意思是您在测试代码中创建的 supervisorActor
的 ActorContext)。
所以 childActor(childActorRef
) 不是测试代码中 supervisorActor(supervisorActorRef
) 的 child。这就是为什么 supervisorActor
的主管策略没有达到目的。
我有以下场景:父主管 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)
}
我希望儿童演员会因为 supervisorStrategy Stop 而停止。 相反,我收到此错误:
java.lang.AssertionError: assertion failed: timeout (1 second) during expectMsg: Terminated
知道为什么会这样吗?谢谢
似乎 childActorRef
不是用 supervisorActorRef
的上下文创建的(我的意思是您在测试代码中创建的 supervisorActor
的 ActorContext)。
所以 childActor(childActorRef
) 不是测试代码中 supervisorActor(supervisorActorRef
) 的 child。这就是为什么 supervisorActor
的主管策略没有达到目的。