我正在研究akka演员(JAVA),最近才知道有3种方式(可能更多)知道演员的存在。
发送识别信息:
ActorSelection sel = actorSystem.actorSelection("akka://test/user/TestActor");
AskableActorSelection asker = new AskableActorSelection(sel);
Future<Object> future = asker.ask(new Identify(1), new Timeout(5,
TimeUnit.SECONDS));
ActorIdentity identity = (ActorIdentity) Await.result(future, timeOut.duration());
ActorRef reference = identity.getRef();
if(reference != null){
// Actor exists
} else {
// Actor does not exits
}
resolveOne方法:
ActorSelection sel = actorSystem.actorSelection("akka://test/user/TestActor");
Future<ActorRef> future = sel.resolveOne(new Timeout(5,
TimeUnit.SECONDS));
// Wait for the completion of task to be completed.
future.onComplete(new OnComplete<ActorRef>() {
@Override
public void onComplete(Throwable excp, ActorRef child)
throws Throwable {
// ActorNotFound will be the Throwable if actor not exists
if (excp != null) {
// Actor does not exists
} else {
// Actor exits
}
}
}, actorSystem.dispatcher());
DeatchWatch : 创建另一个actor调用 getContext()。watch(actorToWatch的ActorRef); 并检查已终止消息的接收。这可能仅用于已经创建的actor。
1,2讲述了演员和3名监视器的存在。我想知道这三个用例以及它们对演员邮箱和功能的影响,以便我可以选择适合我应用的类型。
检查演员的存在是一个好习惯吗?如果不是为什么?。
答案 0 :(得分:5)
嗯,只有一种方法可以知道一个Actor是否存在于过去的某一点:如果你收到一条消息。以上所有内容都只是这个主题的变体。
也就是说,一旦你有了ActorRef,就可以使用DeathWatch来通知该actor的终止。但尚未收到终止消息并不意味着演员仍然活着:终止可能已经在路上了。
将演员视为只能通过发送电子邮件进行通信的人。这种类比对于他们互动的语义非常有效。