You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »



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














  • No labels