Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
176 lines (141 sloc) 4.47 KB
/*
* Copyright (C) 2018-2019 Lightbend Inc. <https://www.lightbend.com>
*/
package typed.tutorial_1
import akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit
import org.scalatest.WordSpecLike
import akka.actor.typed.PostStop
import akka.actor.typed.PreRestart
import akka.actor.typed.Signal
import akka.actor.typed.SupervisorStrategy
//#print-refs
import akka.actor.typed.ActorSystem
import akka.actor.typed.Behavior
import akka.actor.typed.scaladsl.AbstractBehavior
import akka.actor.typed.scaladsl.ActorContext
import akka.actor.typed.scaladsl.Behaviors
object PrintMyActorRefActor {
def apply(): Behavior[String] =
Behaviors.setup(context => new PrintMyActorRefActor(context))
}
class PrintMyActorRefActor(context: ActorContext[String]) extends AbstractBehavior[String](context) {
override def onMessage(msg: String): Behavior[String] =
msg match {
case "printit" =>
val secondRef = context.spawn(Behaviors.empty[String], "second-actor")
println(s"Second: $secondRef")
this
}
}
//#print-refs
//#start-stop
object StartStopActor1 {
def apply(): Behavior[String] =
Behaviors.setup(context => new StartStopActor1(context))
}
class StartStopActor1(context: ActorContext[String]) extends AbstractBehavior[String](context) {
println("first started")
context.spawn(StartStopActor2(), "second")
override def onMessage(msg: String): Behavior[String] =
msg match {
case "stop" => Behaviors.stopped
}
override def onSignal: PartialFunction[Signal, Behavior[String]] = {
case PostStop =>
println("first stopped")
this
}
}
object StartStopActor2 {
def apply(): Behavior[String] =
Behaviors.setup(new StartStopActor2(_))
}
class StartStopActor2(context: ActorContext[String]) extends AbstractBehavior[String](context) {
println("second started")
override def onMessage(msg: String): Behavior[String] = {
// no messages handled by this actor
Behaviors.unhandled
}
override def onSignal: PartialFunction[Signal, Behavior[String]] = {
case PostStop =>
println("second stopped")
this
}
}
//#start-stop
//#supervise
object SupervisingActor {
def apply(): Behavior[String] =
Behaviors.setup(context => new SupervisingActor(context))
}
class SupervisingActor(context: ActorContext[String]) extends AbstractBehavior[String](context) {
private val child = context.spawn(
Behaviors.supervise(SupervisedActor()).onFailure(SupervisorStrategy.restart),
name = "supervised-actor")
override def onMessage(msg: String): Behavior[String] =
msg match {
case "failChild" =>
child ! "fail"
this
}
}
object SupervisedActor {
def apply(): Behavior[String] =
Behaviors.setup(context => new SupervisedActor(context))
}
class SupervisedActor(context: ActorContext[String]) extends AbstractBehavior[String](context) {
println("supervised actor started")
override def onMessage(msg: String): Behavior[String] =
msg match {
case "fail" =>
println("supervised actor fails now")
throw new Exception("I failed!")
}
override def onSignal: PartialFunction[Signal, Behavior[String]] = {
case PreRestart =>
println("supervised actor will be restarted")
this
case PostStop =>
println("supervised actor stopped")
this
}
}
//#supervise
//#print-refs
object Main {
def apply(): Behavior[String] =
Behaviors.setup(context => new Main(context))
}
class Main(context: ActorContext[String]) extends AbstractBehavior[String](context) {
override def onMessage(msg: String): Behavior[String] =
msg match {
case "start" =>
val firstRef = context.spawn(PrintMyActorRefActor(), "first-actor")
println(s"First: $firstRef")
firstRef ! "printit"
this
}
}
object ActorHierarchyExperiments extends App {
val testSystem = ActorSystem(Main(), "testSystem")
testSystem ! "start"
}
//#print-refs
class ActorHierarchyExperiments extends ScalaTestWithActorTestKit with WordSpecLike {
"ActorHierarchyExperiments" must {
def context = this
"start and stop actors" in {
//#start-stop-main
val first = context.spawn(StartStopActor1(), "first")
first ! "stop"
//#start-stop-main
}
"supervise actors" in {
//#supervise-main
val supervisingActor = context.spawn(SupervisingActor(), "supervising-actor")
supervisingActor ! "failChild"
//#supervise-main
Thread.sleep(200) // allow for the println/logging to complete
}
}
}
You can’t perform that action at this time.