怎么知道我得到一个不存在或死的演员

时间:2015-01-09 08:25:04

标签: java akka 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;
}

我让一个演员回来了,但我不知道它是否还活着,直到我发出一条消息。 当然,它没有用。

如何修复此代码?

感谢。

1 个答案:

答案 0 :(得分:1)

你可以使用类似于你已经使用的ActorSelection,但是你需要在它上面调用resolveOne来查找它并返回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调用的阻塞性质。