2013-04-28 3 views
6

ActorContext로 절대 경로를 선택하면 액터가 제대로 작동하지 않습니다 (액터가 올바르게 선택되지 않고 HelloResponse 메시지를받지 못합니다).액터 선택

//From Actor2: 
//This doesn't work (Message never received) 
context.actorSelection("/user/actor1") ! HelloResponse("hello back1") 
//This works (actor 1 receives the message) 
context.system.actorSelection("/user/actor1") ! HelloResponse("hello back2") 

나는 스칼라/Akka에 초보자를 해요하지만 reading documentation이 문제가 해결 해봐야 할 것 같습니다.

+0

다음의 제공 사항 :에 의해 무슨 뜻 이죠) actor1' 3을 만드는 방법'을 보여줍니다 2) 코드 1) 스칼라/Akka 버전 "을하지 않습니다 작업"? 그것은 컴파일합니까? 런타임시 예외가 발생합니까? 'actor1'은'HelloResponse ("hello back1") 메시지를받지 못합니까? 오류 메시지는 무엇을 말합니까? – agilesteel

+0

나는 무엇이 의미가 없는지에 대한 설명을 추가했다. 관심을 가져 주셔서 감사합니다. – lujop

답변

2

액자 안에 context.actorSelection을 사용하면 현재 액터 컨트롤 (/ by 감독자)에서 액터를 찾습니다. actor1이 actor2에 의해 시작되지 않았거나 actor2에 의해 감독되지 않았기 때문에 아무 것도 해결되지 않습니다. actor1이 실제로 actor2에 의해 소유/시작된 경우 을 수행하여 actor2의 해당 자식 배우를 얻을 수 있습니다. 이유는 context.system.actorSelection입니다. 검색을 시작하기 전에 먼저 "system"을 "위로"이동하고 배우의 경로를 정규화해야합니다. 시스템은 액터 1을 system.actorOf으로 시작한 경우이를 소유하므로 해당 경로를 사용하면 system부터 시작할 수 있습니다. 이 예제를 실행하면

class Actor1 extends Actor{ 
    override def preStart = { 
    context.actorOf(Props[Actor2], "actor2") 
    } 
    def receive = { 
    case _ => 
    } 
} 

class Actor2 extends Actor{ 
    override def preStart = {println("my path is: " + context.self.path)} 
    def receive = { 
    case _ => 
    } 
} 

object FutureTesting { 
    def main(args: Array[String]) { 
    val sys = ActorSystem("test") 
    implicit val ec = sys.dispatcher 

    //Starting an Actor2 from system 
    sys.actorOf(Props[Actor2], "actor2") 

    //Starting an Actor1 from system which in turn starts an Actor2 
    sys.actorOf(Props[Actor1], "actor1") 
    } 
} 

, 당신은 볼 수 있습니다 :

my path is: akka://test/user/actor1/actor2 
my path is: akka://test/user/actor2 

그래서 당신은 내가 실행 Actor2의 두 인스턴스를 가질 것을 볼 수 있습니다

약간의 코드가 무슨 뜻인지 보여 내 시스템; 하나는 sys에서 직접 생성되었고 이는 룩업 경로로 /user/actor2에 연결되고 하나는 Actor1의 인스턴스에서 시작하여 경로로 /user/actor1/actor2에 연결됩니다.

액터 시스템은 계층 적이며이 예제는이를 보여줍니다. ActorSystem 그 자체가 모든 것의 근원입니다. 액터 선택은 XPath와 비슷합니다. 즉, 컨텍스트에서 선택하는 것이 문제에서 선택됩니다.

1

actor2에서 당신은 나는 그것이 은유가 파일 시스템과 파일 시스템을 사용하는 경우 선두 / 루트에서 시작을 의미하는 절대 경로가 주어 직관적이지 동의

context.actorSelection("/actor1") 

를 사용해야합니다. 또한 그것은 (Absolute and Relative Paths 참조)

편집 최상위 Actor1을 반환 actorFor

context.actorFor("/user/actor1") 

때문으로 일관성이 -이 Akka 2.1.4에서 수정 된 버그이었다 (롤랜드의 답변을 참조). 2.1.4부터는 context.actorSelection("/user/actor1")을 사용할 수 있습니다.

+0

첫 번째 스 니펫 : context.actorSelection ("/ actor1")도 작동하지 않습니다. 슬래시가 있으면 ActorSelection은 루트 보호자에서 시작하여 Roland가 언급 한 것으로 해석합니다. – neowulf33

+0

작동하지만 버그 였고 이후 수정되었습니다. – sourcedelica

+0

그냥 Akka 2로 테스트했습니다.3-M2 및 context.actorSelection ("/ actor1")이 작동하지 않습니다. ActorSelection은 루트 보호자에서 해결을 시작합니다. – neowulf33