2013-04-28 86 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") 

我的新手到斯卡拉/阿卡但reading documentation似乎应该工作。

+0

请提供以下信息:1)斯卡拉/阿卡版本2),显示了如何'actor1'创建3)什么是你的意思代码“不工作”?它是否编译?它是否在运行时抛出异常? 'actor1'没有收到'HelloResponse(“hello back1”)消息?错误信息是什么意思? – agilesteel 2013-04-28 10:56:18

+0

我添加了一个关于什么是不正常的解释,谢谢你的兴趣。 – lujop 2013-04-28 15:23:02

回答

2

当您在演员内部使用context.actorSelection时,您所说的是在当前演员控制下(由/监督)找到演员。由于actor1可能不是由actor2启动(或者不受actor2监督),所以它不会解析任何东西。如果actor1实际上是由actor2拥有/启动的,那么你可能可以做context.actorSelection("/actor1")来获得actor2的这个孩子actor。 context.system.actorSelection的工作原因是因为在开始搜索之前,您首先要“一直”到system,并完全限定演员的路径。系统“拥有”actor1,如果您以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 2个实例中运行我的系统;其中一个从sys直接产生,与/user/actor2相关,因为它是查找路径,并且从Actor1的一个实例开始,它的路径与/user/actor1/actor2绑定。

演员系统是分层次的,这个例子说明了这一点。 ActorSystem本身是一切的根源。然后选择参与者类似于XPath,因为您正在发布选择的上下文。

1

actor2,你将需要使用

context.actorSelection("/actor1") 

我同意它给出的比喻是一个文件系统,使用文件系统时领先/是绝对路径从根开始的意思是不直观。此外,它是不符合actorFor因为

context.actorFor("/user/actor1") 

返回顶层Actor1(见Absolute and Relative Paths

编辑 - 这是固定在阿卡2.1.4中的错误(见罗兰的答案)。从2.1.4开始,您可以使用context.actorSelection("/user/actor1")

+0

第一个片段:context.actorSelection(“/ actor1”)也不起作用。如果存在正斜杠,则当Roland提到时,ActorSelection将从根监护人开始解决。 – neowulf33 2014-01-07 02:25:03

+0

它正在工作,但是一个错误,并已被修复。 – sourcedelica 2014-01-07 15:27:34

+0

刚刚通过Akka 2测试。3-M2和context.actorSelection(“/ actor1”)不起作用。 ActorSelection将开始在根监护人处解决。 – neowulf33 2014-01-07 22:49:35