propagieren Ich versuche, Fehlerbehandlung mit akka
und zu verstehen. Zum Beispiel habe ich Eltern und Kind Schauspieler.Wie Fehler in Zukunft zu übergeordneten Akteur
Child Schauspieler haben zwei Fehlerfälle:
Fall 1) Fehler passiert, während der Nachrichtenverarbeitung
Fall 2) Fehler passiert im Inneren Zukunft
Ich muss in beiden Fällen Fehler Eltern propagieren, sondern in zweiten Fall ist es nicht passiert. Was mache ich falsch?
import akka.actor.SupervisorStrategy.{Decider, Stop}
import akka.actor.{Actor, ActorRef, ActorSystem, OneForOneStrategy, Props, SupervisorStrategy}
import akka.testkit.{TestKit, TestProbe}
import org.junit.{After, Before, Test}
import scala.concurrent.Future
import scala.util.{Failure, Success}
class Parent(_case: String, probe: ActorRef) extends Actor {
val child = context.actorOf(Props(new Child(_case)), "myLittleChild")
final val defaultStrategy: SupervisorStrategy = {
def defaultDecider: Decider = {
case ex: Exception =>
probe ! ex
Stop
}
OneForOneStrategy()(defaultDecider)
}
override def supervisorStrategy: SupervisorStrategy = defaultStrategy
override def receive: Receive = {
case msg => unhandled(msg)
}
}
class Child(_case: String) extends Actor {
implicit val ec = context.dispatcher
override def preStart(): Unit = {
self ! _case
}
override def receive: Receive = {
case "case1" => throw new RuntimeException("fail")
case "case2" => Future[String] {
throw new RuntimeException("fail")
}.onComplete {
case Success(s) => println(s)
case Failure(e) =>
throw e
}
case msg => unhandled(msg)
}
}
class TestExample {
protected implicit var system: ActorSystem = _
@Before
def setup(): Unit = {
system = ActorSystem.create("test")
}
@After
def tearDown(): Unit = {
TestKit.shutdownActorSystem(system)
}
@Test
def case1(): Unit = {
val testProbe = TestProbe()
system.actorOf(Props(new Parent("case1", testProbe.ref)))
testProbe expectMsgClass classOf[RuntimeException]
}
@Test
def case2(): Unit = {
val testProbe = TestProbe()
system.actorOf(Props(new Parent("case2", testProbe.ref)))
testProbe expectMsgClass classOf[RuntimeException]
}
}
Ich aktualisierte mit vollem Testcode. Und Fall2 schlägt fehl ... – zella
@zella: Aktualisiert. – chunjef