2015-01-09 64 views
2

我試圖將我的代碼從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

您可以使用類似於您已有的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; 
}  

如果演員不存在的ActorNotFound將引發異常,所以你應該決定要處理這個問題。

此外,請注意Await.result調用的阻塞性質。

相關問題