akka
とfutures
で障害処理を理解しようとしました。 たとえば、私は親と子のアクターを持っています。将来、親アクターにエラーを伝播する方法
チャイルドアクターは、2つの障害の場合がありますメッセージ処理
ケース2)エラーが私は両方の場合に親に誤りを伝播するが、中に必要将来
内部に発生している間
ケース1)エラーが発生し2番目のケースは起こりません。私は間違って何をしていますか?
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]
}
}
完全なテストコードで更新しました。 case2は失敗します... – zella
@zella:更新されました。 – chunjef