如何知道我得到了一个不存在或已死的演员
How to know I get a inexistent or dead actor
我试图将我的代码从 Akka 2.0 迁移到 2.3。
我遇到了几个问题。
public synchronized ActorRef getActor(Class<? extends UntypedActor> clsActor, String sID)
{
String sName = clsActor.getName() + "-" + sID;
ActorRef actor = m_actorSystem.actorFor("user/" + sName);
if (actor.isTerminated())
actor = m_actorSystem.actorOf(new Props(clsActor), sName);
return actor;
}
这是演员调度员。如果这个演员死了或者不存在,它会创建一个新的演员。
但是在 Akka 2.3 中,不推荐使用 isTerminated()。
public ActorRef getActor(Class<? extends UntypedActor> clsActor, int id)
{
String sName = clsActor.getName() + "-" + id;
ActorRef actor = m_actorSystem.actorSelection("user/" + sName).anchor();
return actor;
}
我找回了一个演员,但我不知道它是否还活着,直到我发了一条消息。
当然,它没有用。
如何修复此代码?
谢谢。
您可以考虑使用与现有方法类似的 ActorSelection,但您需要对其调用 resolveOne 以查找它并 returns 一个 Future。然后您可以评估结果。
public ActorRef getActor(Class<? extends UntypedActor> clsActor, int id)
{
String sName = clsActor.getName() + "-" + id;
ActorSelection sel = m_actorSystem.actorSelection("user/" + sName);
Timeout timeout = new Timeout(100, TimeUnit.MILLISECONDS);
Future<ActorRef> fut = sel.resolveOne(timeout);
ActorRef actor= Await.result(fut, timeout.duration());
return actor;
}
如果 actor 不存在,将抛出 ActorNotFound
异常,因此您应该决定要在哪里处理它。
另外,请注意 Await.result 调用的阻塞性质。
我试图将我的代码从 Akka 2.0 迁移到 2.3。 我遇到了几个问题。
public synchronized ActorRef getActor(Class<? extends UntypedActor> clsActor, String sID)
{
String sName = clsActor.getName() + "-" + sID;
ActorRef actor = m_actorSystem.actorFor("user/" + sName);
if (actor.isTerminated())
actor = m_actorSystem.actorOf(new Props(clsActor), sName);
return actor;
}
这是演员调度员。如果这个演员死了或者不存在,它会创建一个新的演员。
但是在 Akka 2.3 中,不推荐使用 isTerminated()。
public ActorRef getActor(Class<? extends UntypedActor> clsActor, int id)
{
String sName = clsActor.getName() + "-" + id;
ActorRef actor = m_actorSystem.actorSelection("user/" + sName).anchor();
return actor;
}
我找回了一个演员,但我不知道它是否还活着,直到我发了一条消息。 当然,它没有用。
如何修复此代码?
谢谢。
您可以考虑使用与现有方法类似的 ActorSelection,但您需要对其调用 resolveOne 以查找它并 returns 一个 Future。然后您可以评估结果。
public ActorRef getActor(Class<? extends UntypedActor> clsActor, int id)
{
String sName = clsActor.getName() + "-" + id;
ActorSelection sel = m_actorSystem.actorSelection("user/" + sName);
Timeout timeout = new Timeout(100, TimeUnit.MILLISECONDS);
Future<ActorRef> fut = sel.resolveOne(timeout);
ActorRef actor= Await.result(fut, timeout.duration());
return actor;
}
如果 actor 不存在,将抛出 ActorNotFound
异常,因此您应该决定要在哪里处理它。
另外,请注意 Await.result 调用的阻塞性质。