Akka는 기본적으로 탑레벨 아키텍쳐의 설계방식으로 Actor를 위치시키고(트리) 접근을 하며
자식노드의 장애처리를 부모가 할수 있으며,부모의 예외는 자식노드에게 전가시키지 않는다. ( 장애 허용시스템 )
기본 액터생성
class PrintMyActorRefActor extends Actor { override def receive: Receive = { case "printit" => val secondRef = context.actorOf(Props.empty, "second-actor") println(s"Second: $secondRef") } } val firstRef = system.actorOf(Props[PrintMyActorRefActor], "first-actor") println(s"First : $firstRef") firstRef ! "printit" //액터 생성 순서 first-actor <= second-actor 가 parent <= child 관계가 된다. First : Actor[akka://testSystem/user/first-actor#1053618476] Second: Actor[akka://testSystem/user/first-actor/second-actor#-1544706041]
아래와같이, rest의 endpoint 와 유사하게 접근이 가능합니다.
Actor접근법
var parentActor= system.ActorSelection("akka://testSystem/user/first-actor"); var childActor= system.ActorSelection("akka://testSystem/user/first-actor/second-actor");
이런 구조적인 설계로, 부모의 액터를 정지시키면 자식의 액터를 모두 종류후 마지막에 부모 액터가 종료가됩니다.
이것은 부모가 자식을 책임지는 AKKA의 기본 예외 처리모델과도 부합합니다.
Actor 중지
class StartStopActor1 extends Actor { override def preStart(): Unit = { println("first started") context.actorOf(Props[StartStopActor2], "second") } override def postStop(): Unit = println("first stopped") override def receive: Receive = { case "stop" => context.stop(self) } } class StartStopActor2 extends Actor { override def preStart(): Unit = println("second started") override def postStop(): Unit = println("second stopped") // Actor.emptyBehavior is a useful placeholder when we don't // want to handle any messages in the actor. override def receive: Receive = Actor.emptyBehavior } val first = system.actorOf(Props[StartStopActor1], "first") first ! "stop" //OutPut //first started //second started //second stopped //first stopped