簡體   English   中英

演員選擇

[英]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/actor2Actor1實例開始的。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM