2015-01-28 26 views
7

Używam Akka 2.10 z JAVA.Nazwa aktora nie jest unikalna - AKKA

Mam metodę, która pobiera odniesienie aktora za mną - lub utworzyć jeśli nie było wcześniej - ale kilka razy, gdy próbuję utworzyć pojawia się następujący wyjątek:

akka.actor.InvalidActorNameException: actor name [<ActorName>] is not unique! 
    at akka.actor.dungeon.ChildrenContainer$NormalChildrenContainer.reserve(ChildrenContainer.scala:130) 
    at akka.actor.dungeon.Children$class.reserveChild(Children.scala:77) 
    at akka.actor.ActorCell.reserveChild(ActorCell.scala:369) 
    at akka.actor.dungeon.Children$class.makeChild(Children.scala:202) 
    at akka.actor.dungeon.Children$class.attachChild(Children.scala:42) 
    at akka.actor.ActorCell.attachChild(ActorCell.scala:369) 
    at akka.actor.ActorSystemImpl.actorOf(ActorSystem.scala:552) 

oczywiście Wiem, wyjątek jest bardzo jasny: staram się stworzyć więcej niż jednego aktora z tym samym identyfikatorem, ale robię to, gdy nie mogę znaleźć odniesienia do aktora. Z czasem:

private static ActorRef getActor(String id,Class actor) throws Exception{ 
    ActorSelection sel = system.actorSelection(system.child(id)); 
    Timeout t = new Timeout(4, TimeUnit.SECONDS); 
    AskableActorSelection asker = new AskableActorSelection(sel); 
    scala.concurrent.Future<Object> fut = asker.ask(new Identify(1), t); 
    ActorRef actorClient = null; 
    try{ 
     //Try to get an Actor reference 
     ActorIdentity ident = (ActorIdentity)Await.result(fut, t.duration()); 
     actorClient = ident.getRef(); 
    } catch(Exception e){ 
     System.out.println("Error:"+id); 
    } finally{ 
     //IF I dont found create a new One 
     if(actorClient==null){ 
      actorClient = system.actorOf(Props.create(actor),id); 
      //THROWS ME AN EXCEPTION 
     } 
    } 
    return actorClient; 
} 

Czekam 4 sekundy bez odpowiedzi ... więc tworzę nowy.

Szukałem w internecie za pośrednictwem rozwiązania dla mojego przypadku, ale bez powodzenia ...

Czy ktoś może mi pomóc rozwiązać ten problem?

Wielkie dzięki!

+0

Dlaczego nie stworzysz aktora w 'Global.onStart'? W ten sposób masz pewność, że będzie on dostępny, kiedy będziesz go potrzebować. – Salem

+0

W każdym razie, dlaczego chcesz go tak dokładnie utworzyć? Jaki jest przypadek użycia? Dla mnie wygląda to trochę dziwnie. – ale64bit

+1

@kaktusito, teraz utworzyłem aktora, który właśnie robi to połączenie, więc zwiększyłem limit czasu i teraz nie mam żadnych problemów ... –

Odpowiedz

6

Zgodnie z documentation nie należy ponownie używać ścieżek aktorów, nawet jeśli aktor zginął. Domyślam się, że wcześniej stworzyłeś aktora o tym nazwisku, umarł, a teraz nie można go znaleźć za pomocą mechanizmu selekcji aktorów. Próbując stworzyć nowego aktora o tej nazwie, używasz tego wyjątku.