2015-01-28 4 views
7

나는 Akka 2.10을 JAVA와 함께 사용하고 있습니다.배우 이름이 고유하지 않습니다. - AKKA

내가 나를 위해 배우 참조를 취하는 방법이 - 또는 전 그런게있을 경우 하나를 만들 -하지만 약간의 시간이 나는 다음과 같은 예외가 나타납니다 하나 만들려고 할 때 : 물론

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) 

을, 나는 예외가 매우 분명하다는 것을 알고있다. 나는 동일한 식별자를 가진 액터를 두 개 이상 만들려고 노력하고 있지만 액터의 참조를 찾을 수 없을 때 이것을 수행한다. 시간 :

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; 
} 

응답없이 4 초를 기다렸습니다 ... 그래서 새 것을 만듭니다.

나는 내 경우에 대한 해결책을 통해 인터넷을 검색하지만 성공하지 ...

은 누구도 날이 문제를 해결하는 데 도움이 수 있습니까?

고맙습니다.

+0

왜'Global.onStart'에서 액터를 만들지 않습니까? 이 방법으로 필요할 때 사용할 수 있다고 확신 할 수 있습니다. – Salem

+0

어쨌든 왜 그런 식으로 정확하게 만들고 싶습니까? 유스 케이스 란 무엇입니까? 그것은 나에게 약간 어색해 보인다. – ale64bit

+1

@kaktusito, 이제 저는이 전화를하는 배우를 만들었습니다. 그래서 타임 아웃을 늘렸고 지금은 문제가 없습니다 ... –

답변

6

documentation에 따르면 액터가 죽은 경우에도 액터 경로를 다시 사용하면 안됩니다. 내 생각 엔 이전에 그 이름의 배우를 만들었는데, 그것은 죽었고 이제 배우 선택 메커니즘을 통해 찾을 수 없습니다. 그 이름을 가진 새 액터를 만들려고하면이 예외가 발생합니다.

관련 문제