액터가 생성되고 삭제되기 까지 어떠한 생명주기를 가지는가에대한 주제로
OOP에서도 우리가 만든 객체가 어떠한 생명주기를 가지고 메모리에 해제가 되는가와
연관된 주제입니다. 가비지 컬렉터가 관여하는 생명주기와, 설계된 액터의 생명주기
관리는 많은 차이가 있습니다. 일반적으로 액터는 직접 종료하거나,장애에 의해 제거조건이
생기지 않는한 자동으로 소멸되지 않습니다.
액터의 생명주기를 잘 표현한 그림입니다.
액터생성
actorSystem.actorOf( ext.props("testActor"),"Actor1" )
actorSystem.actorOf( ext.props("testActor"),"Actor2" )
actorSystem.actorOf( ext.props("testActor"),"Actor2" )
설계된 액터는, ActorOf를 통해 인스턴스가 생성되고 고유한 이름(경로)을 가지게 됩니다.
액터는 탑다운 방식으로 생성이되며 오로지 부모객체(Context)를 통해서만 생성이됩니다.
이것은 추후 부모객체가 자식을 책임지는 장애처리 모델로 이어지게됩니다.
Actor1의 하위에 Child 액터를 생성하려면 Acotr1의 내부 메시지처리기에서
Context를 획득하여 Context.actorOf( ext.props("testActor"),"ChildActor1" )
동일한 패턴으로 생성이 가능합니다. 일반적인 라이브러리들은
객체에 직접접근하여 Child를 추가할수 있는방법을 제공하지만
AKKA에서는 메시지접근을 통해서만 Child 생성이 가능합니다.
OOP에서 익숙한 actor1.actorOf(..) 를 통해 객체생성이 안됨을 의미합니다.
이것은 Actor가 리모트/클러스터로 로컬에서의 작성방법과 동일하게 확장됨을의미하지만
반대로 로컬에서의 개발이 불필요하게 복잡해질수 있다란 단점도 있습니다.
PreStart
액터 생성되기전, 호출이 되며 보통 액터가 생성되기전 어떠한 준비된 설정을 진행시킬수가 있습니다.
PostStop
액터는 정지를 시킬수가 있으며 , 정지를 시키는 단계에서 어떠한 처리기를 설계할수가 있습니다.
PreRestart
액터는 재시작이될수 있으며, 재시작 메카니즘은 일반적으로 오래된 객체를 없애고 새로운 객체로 대처하는과정이
숨겨져있습니다. 이때 객체가 교체되기전 오래된 액터 Context를 사용할수 있는 단계이며
재시작 프로세스에서 오래된 액터에게 어떠한 기능설계를 할수 있는곳입니다.
PostRestart
재시작 처리가 성공적으로 이루어진 단계이며 이전 액터가 이미 소멸되었기때문에 새로운 액터의 Context만 사용할수 있는 단계입니다.
액터 모니터링 샘플
import akka.actor.Terminated; public class WatchActor extends AbstractActor { private final ActorRef child = getContext().actorOf(Props.empty(), "target"); private ActorRef lastSender = system.deadLetters(); public WatchActor() { getContext().watch(child); // <-- this is the only call needed for registration } @Override public Receive createReceive() { return receiveBuilder() .matchEquals("kill", s -> { getContext().stop(child); lastSender = getSender(); }) .match(Terminated.class, t -> t.actor().equals(child), t -> { lastSender.tell("finished", getSelf()); }) .build(); } }
액터의 종료 상태를 알려주는 심플한 모니터링 액터 설계의 한예입니다.