2017-03-28 15:21:29 +02:00
|
|
|
package tutorial_1
|
|
|
|
|
|
|
|
|
|
import akka.actor.{ Actor, Props }
|
|
|
|
|
import akka.testkit.AkkaSpec
|
|
|
|
|
|
|
|
|
|
//#print-refs
|
|
|
|
|
class PrintMyActorRefActor extends Actor {
|
|
|
|
|
override def receive: Receive = {
|
|
|
|
|
case "printit" =>
|
|
|
|
|
val secondRef = context.actorOf(Props.empty, "second-actor")
|
2017-04-07 13:39:25 -04:00
|
|
|
println(s"Second: $secondRef")
|
2017-03-28 15:21:29 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//#print-refs
|
|
|
|
|
|
|
|
|
|
//#start-stop
|
|
|
|
|
class StartStopActor1 extends Actor {
|
|
|
|
|
override def preStart(): Unit = {
|
|
|
|
|
println("first started")
|
|
|
|
|
context.actorOf(Props[StartStopActor2], "second")
|
|
|
|
|
}
|
|
|
|
|
override def postStop(): Unit = println("first stopped")
|
2017-04-07 13:39:25 -04:00
|
|
|
|
|
|
|
|
override def receive: Receive = {
|
|
|
|
|
case "stop" => context.stop(self)
|
|
|
|
|
}
|
2017-03-28 15:21:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class StartStopActor2 extends Actor {
|
2017-04-07 13:39:25 -04:00
|
|
|
override def preStart(): Unit = println("second started")
|
|
|
|
|
override def postStop(): Unit = println("second stopped")
|
|
|
|
|
|
2017-03-28 15:21:29 +02:00
|
|
|
// Actor.emptyBehavior is a useful placeholder when we don't
|
|
|
|
|
// want to handle any messages in the actor.
|
|
|
|
|
override def receive: Receive = Actor.emptyBehavior
|
|
|
|
|
}
|
|
|
|
|
//#start-stop
|
|
|
|
|
|
|
|
|
|
//#supervise
|
|
|
|
|
class SupervisingActor extends Actor {
|
|
|
|
|
val child = context.actorOf(Props[SupervisedActor], "supervised-actor")
|
|
|
|
|
|
|
|
|
|
override def receive: Receive = {
|
|
|
|
|
case "failChild" => child ! "fail"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class SupervisedActor extends Actor {
|
|
|
|
|
override def preStart(): Unit = println("supervised actor started")
|
|
|
|
|
override def postStop(): Unit = println("supervised actor stopped")
|
|
|
|
|
|
|
|
|
|
override def receive: Receive = {
|
|
|
|
|
case "fail" =>
|
|
|
|
|
println("supervised actor fails now")
|
|
|
|
|
throw new Exception("I failed!")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//#supervise
|
|
|
|
|
|
|
|
|
|
class ActorHierarchyExperiments extends AkkaSpec {
|
|
|
|
|
"create top and child actor" in {
|
2017-04-07 13:39:25 -04:00
|
|
|
// format: OFF
|
2017-03-28 15:21:29 +02:00
|
|
|
//#print-refs
|
|
|
|
|
|
2017-04-07 13:39:25 -04:00
|
|
|
val firstRef = system.actorOf(Props[PrintMyActorRefActor], "first-actor")
|
|
|
|
|
println(s"First : $firstRef")
|
|
|
|
|
firstRef ! "printit"
|
|
|
|
|
//#print-refs
|
|
|
|
|
// format: ON
|
2017-03-28 15:21:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"start and stop actors" in {
|
2017-04-07 13:39:25 -04:00
|
|
|
// format: OFF
|
2017-03-28 15:21:29 +02:00
|
|
|
//#start-stop
|
2017-04-07 13:39:25 -04:00
|
|
|
|
|
|
|
|
val first = system.actorOf(Props[StartStopActor1], "first")
|
|
|
|
|
first ! "stop"
|
2017-03-28 15:21:29 +02:00
|
|
|
//#start-stop
|
2017-04-07 13:39:25 -04:00
|
|
|
// format: ON
|
2017-03-28 15:21:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"supervise actors" in {
|
2017-04-07 13:39:25 -04:00
|
|
|
// format: OFF
|
2017-03-28 15:21:29 +02:00
|
|
|
//#supervise
|
2017-04-07 13:39:25 -04:00
|
|
|
|
|
|
|
|
val supervisingActor = system.actorOf(Props[SupervisingActor], "supervising-actor")
|
|
|
|
|
supervisingActor ! "failChild"
|
2017-03-28 15:21:29 +02:00
|
|
|
//#supervise
|
2017-04-07 13:39:25 -04:00
|
|
|
// format: ON
|
2017-03-28 15:21:29 +02:00
|
|
|
}
|
|
|
|
|
}
|