=doc #16459 change confusing FaultHandlingDocSpec in Fault Tolerance Document.
This commit is contained in:
parent
c56d670c03
commit
c0867e1308
1 changed files with 77 additions and 70 deletions
|
|
@ -6,8 +6,10 @@ package docs.actor
|
||||||
import language.postfixOps
|
import language.postfixOps
|
||||||
|
|
||||||
//#testkit
|
//#testkit
|
||||||
import akka.testkit.{ AkkaSpec, ImplicitSender, EventFilter }
|
import akka.testkit.{ TestKit, ImplicitSender, EventFilter }
|
||||||
import akka.actor.{ ActorRef, Props, Terminated }
|
import akka.actor.{ ActorRef, Props, ActorSystem, Terminated }
|
||||||
|
import org.scalatest._
|
||||||
|
import com.typesafe.config.{ Config, ConfigFactory }
|
||||||
|
|
||||||
//#testkit
|
//#testkit
|
||||||
object FaultHandlingDocSpec {
|
object FaultHandlingDocSpec {
|
||||||
|
|
@ -91,83 +93,88 @@ object FaultHandlingDocSpec {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//#child
|
//#child
|
||||||
|
|
||||||
|
val testConf: Config = ConfigFactory.parseString("""
|
||||||
|
akka {
|
||||||
|
loggers = ["akka.testkit.TestEventListener"]
|
||||||
|
}
|
||||||
|
""")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
import FaultHandlingDocSpec._
|
||||||
//#testkit
|
//#testkit
|
||||||
class FaultHandlingDocSpec extends AkkaSpec with ImplicitSender {
|
class FaultHandlingDocSpec extends TestKit(ActorSystem("FaultHandlingDocSpec", testConf))
|
||||||
|
with FlatSpecLike with BeforeAndAfterAll with ImplicitSender {
|
||||||
|
|
||||||
|
override def afterAll() {
|
||||||
|
system.terminate()
|
||||||
|
}
|
||||||
//#testkit
|
//#testkit
|
||||||
|
|
||||||
import FaultHandlingDocSpec._
|
"A supervisor" must "apply the chosen strategy for its child" in {
|
||||||
//#testkit
|
//#testkit
|
||||||
|
|
||||||
"A supervisor" must {
|
//#create
|
||||||
|
val supervisor = system.actorOf(Props[Supervisor], "supervisor")
|
||||||
|
|
||||||
"apply the chosen strategy for its child" in {
|
supervisor ! Props[Child]
|
||||||
//#testkit
|
val child = expectMsgType[ActorRef] // retrieve answer from TestKit’s testActor
|
||||||
|
//#create
|
||||||
|
EventFilter.warning(occurrences = 1) intercept {
|
||||||
|
//#resume
|
||||||
|
child ! 42 // set state to 42
|
||||||
|
child ! "get"
|
||||||
|
expectMsg(42)
|
||||||
|
|
||||||
//#create
|
child ! new ArithmeticException // crash it
|
||||||
val supervisor = system.actorOf(Props[Supervisor], "supervisor")
|
child ! "get"
|
||||||
|
expectMsg(42)
|
||||||
supervisor ! Props[Child]
|
//#resume
|
||||||
val child = expectMsgType[ActorRef] // retrieve answer from TestKit’s testActor
|
|
||||||
//#create
|
|
||||||
EventFilter.warning(occurrences = 1) intercept {
|
|
||||||
//#resume
|
|
||||||
child ! 42 // set state to 42
|
|
||||||
child ! "get"
|
|
||||||
expectMsg(42)
|
|
||||||
|
|
||||||
child ! new ArithmeticException // crash it
|
|
||||||
child ! "get"
|
|
||||||
expectMsg(42)
|
|
||||||
//#resume
|
|
||||||
}
|
|
||||||
EventFilter[NullPointerException](occurrences = 1) intercept {
|
|
||||||
//#restart
|
|
||||||
child ! new NullPointerException // crash it harder
|
|
||||||
child ! "get"
|
|
||||||
expectMsg(0)
|
|
||||||
//#restart
|
|
||||||
}
|
|
||||||
EventFilter[IllegalArgumentException](occurrences = 1) intercept {
|
|
||||||
//#stop
|
|
||||||
watch(child) // have testActor watch “child”
|
|
||||||
child ! new IllegalArgumentException // break it
|
|
||||||
expectMsgPF() { case Terminated(`child`) => () }
|
|
||||||
//#stop
|
|
||||||
}
|
|
||||||
EventFilter[Exception]("CRASH", occurrences = 2) intercept {
|
|
||||||
//#escalate-kill
|
|
||||||
supervisor ! Props[Child] // create new child
|
|
||||||
val child2 = expectMsgType[ActorRef]
|
|
||||||
|
|
||||||
watch(child2)
|
|
||||||
child2 ! "get" // verify it is alive
|
|
||||||
expectMsg(0)
|
|
||||||
|
|
||||||
child2 ! new Exception("CRASH") // escalate failure
|
|
||||||
expectMsgPF() {
|
|
||||||
case t @ Terminated(`child2`) if t.existenceConfirmed => ()
|
|
||||||
}
|
|
||||||
//#escalate-kill
|
|
||||||
//#escalate-restart
|
|
||||||
val supervisor2 = system.actorOf(Props[Supervisor2], "supervisor2")
|
|
||||||
|
|
||||||
supervisor2 ! Props[Child]
|
|
||||||
val child3 = expectMsgType[ActorRef]
|
|
||||||
|
|
||||||
child3 ! 23
|
|
||||||
child3 ! "get"
|
|
||||||
expectMsg(23)
|
|
||||||
|
|
||||||
child3 ! new Exception("CRASH")
|
|
||||||
child3 ! "get"
|
|
||||||
expectMsg(0)
|
|
||||||
//#escalate-restart
|
|
||||||
}
|
|
||||||
//#testkit
|
|
||||||
// code here
|
|
||||||
}
|
}
|
||||||
|
EventFilter[NullPointerException](occurrences = 1) intercept {
|
||||||
|
//#restart
|
||||||
|
child ! new NullPointerException // crash it harder
|
||||||
|
child ! "get"
|
||||||
|
expectMsg(0)
|
||||||
|
//#restart
|
||||||
|
}
|
||||||
|
EventFilter[IllegalArgumentException](occurrences = 1) intercept {
|
||||||
|
//#stop
|
||||||
|
watch(child) // have testActor watch “child”
|
||||||
|
child ! new IllegalArgumentException // break it
|
||||||
|
expectMsgPF() { case Terminated(`child`) => () }
|
||||||
|
//#stop
|
||||||
|
}
|
||||||
|
EventFilter[Exception]("CRASH", occurrences = 2) intercept {
|
||||||
|
//#escalate-kill
|
||||||
|
supervisor ! Props[Child] // create new child
|
||||||
|
val child2 = expectMsgType[ActorRef]
|
||||||
|
watch(child2)
|
||||||
|
child2 ! "get" // verify it is alive
|
||||||
|
expectMsg(0)
|
||||||
|
|
||||||
|
child2 ! new Exception("CRASH") // escalate failure
|
||||||
|
expectMsgPF() {
|
||||||
|
case t @ Terminated(`child2`) if t.existenceConfirmed => ()
|
||||||
|
}
|
||||||
|
//#escalate-kill
|
||||||
|
//#escalate-restart
|
||||||
|
val supervisor2 = system.actorOf(Props[Supervisor2], "supervisor2")
|
||||||
|
|
||||||
|
supervisor2 ! Props[Child]
|
||||||
|
val child3 = expectMsgType[ActorRef]
|
||||||
|
|
||||||
|
child3 ! 23
|
||||||
|
child3 ! "get"
|
||||||
|
expectMsg(23)
|
||||||
|
|
||||||
|
child3 ! new Exception("CRASH")
|
||||||
|
child3 ! "get"
|
||||||
|
expectMsg(0)
|
||||||
|
//#escalate-restart
|
||||||
|
}
|
||||||
|
//#testkit
|
||||||
|
// code here
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//#testkit
|
//#testkit
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue