2013-04-27 93 views
0

當處理一條消息時,是否有可能向另一個演員發送消息並等待該演員回覆,然後消耗回覆的消息,然後繼續,如下所示,這是可行的嗎?演員:可能發送和接收嵌套在一個接收

val lineMap=HashMap[String,Int]() 
receive { 
    case bigTaskMap=> 
     for (line <-readSomeFile){ 
      if(lineMap.get(line)==None){ 
       anotherActor!line // that actor will reply a hashmap which contain the key for line 
       receive { 
       case x:HashMap => lineMap=x 
       }  
      } 
      lineMap.get(line) // use that value to do further work 
     } 
} 
+0

我認爲你應該查找成爲/不成立或「問」。也就是說,如果是阿卡演員。在scala演員中,你只需使用「val reply = actor!?message」 – Felix 2013-04-27 14:30:28

+1

這裏是一個鏈接,其中包含關於「ask」的詳細信息,它返回一個未來,它允許你阻止並等待回覆:http://doc.akka。 IO /文檔/阿卡/快照/斯卡拉/ actors.html – Felix 2013-04-27 14:33:23

回答

1

這個答案是阿卡(舊斯卡拉演員在斯卡拉2.10過時了)。

是的。您可以使用ask來獲得未來(而不是自己創建一個完整的演員),然後在Future上調用onComplete來設置一個動作,當Future值(或錯誤)變爲可用時,將執行該動作。不要擔心Future能夠多快產生一個價值 - 無所謂,因爲即使Future已經可用,當調用onComplete時,onComplete動作也會執行!

但是,要非常小心:您不應該直接訪問操作中包含的actor的任何狀態(即變量),因爲onComplete操作不會在同一個執行上下文中運行作爲演員(即他們可以與原演員正在處理消息的同時運行)。相反,將更多消息發送回原始演員,或轉發他們。

事實上,在某些情況下,您可能會發現最簡單的事情就是發送消息,並讓原始參與者處理答覆。 becomeunbecome可能有幫助。但是,再次,如果使用become,請小心,在演員的新行爲中,它不會丟棄應該以普通方式處理的「普通」消息。