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!
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
W każdym razie, dlaczego chcesz go tak dokładnie utworzyć? Jaki jest przypadek użycia? Dla mnie wygląda to trochę dziwnie. – ale64bit
@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 ... –