[英]Actor selection
為什么當我用ActorContext選擇一個絕對路徑時它不起作用(未正確選擇actor並且沒有收到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")
我是Scala / Akka的新手,但閱讀文檔似乎應該有效。
這是一個錯誤,感謝您的詢問: https : //www.assembla.com/spaces/ddEDvgVAKr3QrUeJe5aVNr/tickets/3276
當你在actor中使用context.actorSelection
,你所說的是在當前actor控件下找到一個actor(由/監督者啟動)。 由於actor1可能不是由actor2啟動的(或者不是由actor2監督的),因此它不會解析為任何東西。 如果actor1實際上由actor2擁有/啟動,那么你可以使用context.actorSelection("/actor1")
來獲取actor2的子actor。 context.system.actorSelection
工作的原因是因為在開始搜索之前你首先“向上”到system
,並完全限定了actor的路徑。 如果你把它作為system.actorOf
啟動,系統“擁有”actor1,所以使用該路徑將允許你從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
所以你可以看到我在我的系統中運行了2個Actor2
實例; 一個是直接從sys
綁定到/user/actor2
因為它是查找路徑,一個是從綁定到/user/actor1/actor2
的Actor1
實例開始的。
actor系統是分層的,這個例子表明了這一點。 ActorSystem
本身就是一切的根源。 因此,選擇actor類似於XPath,因為您發出select的內容。
從actor2
你需要使用
context.actorSelection("/actor1")
我同意它不直觀,因為隱喻是一個文件系統,當使用文件系統時,一個前導/
是一個絕對路徑,意味着從根開始。 它也與actorFor
不一致,因為
context.actorFor("/user/actor1")
返回頂級Actor1
(參見絕對路徑和相對路徑 )
編輯 - 這是一個在Akka 2.1.4中修復的錯誤(參見Roland的回答)。 從2.1.4開始,您可以使用context.actorSelection("/user/actor1")
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.