Actor Selection을 통한 Actor 찾기 (Identifying Actors via Actor Selection)
- 하나의 액터는 Unique한 Path를 가지고 있기 때문에 Path를 이용하여 Actor를 찾을수가 있다 (Look up)
// will look up this absolute path
getContext().actorSelection("/user/serviceA/actor");
// will look up sibling beneath same supervisor
getContext().actorSelection("../joe");
- `ActorSelection` 객체가 리턴이 된다.
- Remote System에서는 `ActorSelection`은 처음 응답은 한 Actor (initiating first contact with a remote system)
- At-Least-Once Delivery
ActorSelection을 통해 ActorRef 얻기
import akka.actor.ActorIdentity;
import akka.actor.ActorSelection;
import akka.actor.Identify;
public class Follower extends AbstractActor {
final Integer identifyId = 1;
public Follower(){
ActorSelection selection = getContext().actorSelection("/user/another");
selection.tell(new Identify(identifyId), getSelf());
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(ActorIdentity.class, id -> id.getActorRef().isPresent(), id -> {
ActorRef ref = id.getActorRef().get();
getContext().watch(ref);
getContext().become(active(ref));
})
.match(ActorIdentity.class, id -> !id.getActorRef().isPresent(), id -> {
getContext().stop(getSelf());
})
.build();
}
final AbstractActor.Receive active(final ActorRef another) {
return receiveBuilder()
.match(Terminated.class, t -> t.actor().equals(another), t ->
getContext().stop(getSelf())
)
.build();
}
}
- `/user/another` 이라는 path를 가진 Actor Selection을 찾고 ActorRef를 얻은뒤 `become`를 통해 다른 기능으로 작동으로 바뀌는 엑터
- `resolveOne` 메서드를 사용하면 ActorRef를 가진 Future을 받을수가 있다.
- Future를 이용하여 동기적으로 ActorRef를 가지고 올수 있다.
- 하지만 이경우에는 같은 path를 가진 (cluster) Actor를 하나 밖에 못가지고 온다.
- `/*` 같이 전체 Actor를 가지고 오고 싶다면 위와 같은 방식으로 해야되고, child 관계 까지 필요하다면 Recursive 하게 이용하여 가지고 올수 있다.
추가 (2018/09/06)
- Actor Selection은 실행되고 있는 ActorSystem의 JVM의 내에서의 Actor만 찾을수 있기 때문에 Cluster에서의 Actor를 찾기 위해서는 Remote Address를 이용하여 Actor Lookup를 활수 있다.
'Programing > Akka' 카테고리의 다른 글
Akka Distributed Publish Subscribe in Cluster #3. Configuration (0) | 2018.09.11 |
---|---|
Akka Distributed Publish Subscribe in Cluster #2.Send (0) | 2018.09.11 |
Akka Cluster Seed Node (0) | 2018.08.25 |
Akka Management (0) | 2018.08.21 |
Akka Scheduler (0) | 2018.08.21 |