액터는 어디든 생성할수 있고, 어디에서든지 참조하여 메시지 전송이 가능합니다.
이와 관련된 액터의 특징을 살펴보겠습니다.
ActorOf vs ActorSelection
// 'user/myActor' 경로에 사용자가 설계한 MyActor를 생성합니다. user는 최상위 root입니다.
IActorRef myActor = this.Sys.ActorOf<MyActor>("myActor");
// 이미 생성된 'user/MyActor'를 선택합니다.
ActorSelection myActor2 = this.Sys.ActorSelection("user/myActor");
- ActorOf 는 액터를 직접 만들고(자신의 자식으로) 그에 대한 참조를 반환합니다.
- ActorSelection 은 이미 생성되어 있는 액터를 선택할수가 있습니다.
Absolute vs. Relative Paths
//Local
Context.ActorSelection("../brother").Tell(msg);
Context.ActorSelection("/user/serviceA").Tell(msg);
//Remote
var remoteHello = actorSystem.ActorSelection("akka.tcp://ANODE@127.0.0.1:7000/user/hello");
액터는 상대경로로 접근이 가능하며, 원격일경우 원격주소를 명시하여 원격접근도 가능합니다.
Reusing Actor Paths
//동일한 주소의 액터를 생성하고 ,삭제하고 다시 생성한다.
IActorRef myActor = this.Sys.ActorOf<MyActor>("myActor");
ActorSelection myActor3 = this.Sys.ActorSelection("user/myActor");
myActor.GracefulStop(TimeSpan.FromSeconds(1)).Wait();
IActorRef myActor2 = this.Sys.ActorOf<MyActor>("myActor");
//주소 참조는, 동일한 주소에 액터가 있으면 참조가능하다.
myActor3.Tell("Hello", this.TestActor);
ExpectMsg("RE:Hello", TimeSpan.FromSeconds(0.2));
//액터 참조의경우 액터가 삭제되면 참조를 잃는다.
myActor.Tell("Hello", this.TestActor);
ExpectMsg("RE:Hello", TimeSpan.FromSeconds(0.2));
액터는 삭제가능하며, 삭제된 액터의 주소는 재사용해서 다시 액터할당이 가능합니다.
이역우 ActorRef와 ActorSelection은 다음과 같은 차이점이 있습니다.
- ActorRef : 참조이후 액터가 삭제되고, 동일한 주소에 액터가 생성되어도 이전에 참조된 액터의 참조이기때문에 참조를 읽게됩니다.
- ActorSelection : 선택이후 액터가 삭제되고 동일한 경로에 액터에 생성될시 액터에대한 주소를 선택하기때문에 참조를 읽지 않습니다.
Actor Life Cycle
