2014-09-23 21 views
0

我有一個主管,使用默認的Play創建子進程! 2.2 Akka.system。當我試圖瞬間殺死主管時,沒有任何反應,並且一直處理。爲什麼Akka Kill不會終止這位主管及其子女?

class ImportSupervisor extends Actor { 

     import akka.actor.AllForOneStrategy 
     import akka.actor.SupervisorStrategy._ 
     import scala.concurrent.duration._ 

     val log = Logging(context.system, this) 
     override val supervisorStrategy = 
      AllForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 hour) { 
      case e: Exception => Stop 
      } 

     override def preStart() { 
      Logger.info("supervisor starting up at "+self.toString) 
     } 

     def receive = { 
      case p: Props => context.actorOf(p) 
     } 
     } 

下面是我使用的殺擁有大約1000名兒童主管代碼:

Akka.system.actorSelection("akka://application/user/"+actorName) ! Kill

我可以確認我收到ActorPath正確的,但問題是Kill不會立即生效。我試過Stop。我究竟做錯了什麼?假設它會立即關閉是錯誤的嗎?

+0

通過設計,阿卡從來沒有保證什麼會,甚至是特定的延遲後執行「立即」。例如,當在「2秒」內安排要執行的任務時,您不應該認爲它會在2秒內有效運行。 – vptheron 2014-09-23 18:08:20

回答

4

假設它會立即關閉是錯誤的嗎?

是的。

Kill消息將被放入演員的郵箱中,就像任何其他消息一樣。如果前面還有其他消息,則其他演員正忙於處理另一條消息,消息將不得不等待。

所有這一切都在文檔中進行了說明:

http://doc.akka.io/docs/akka/2.2.4/scala/actors.html#Stopping_actors

+0

這是什麼想法,但問題中提到的「停止」呢?我讀了同樣的文檔,我誤解了「停止」會做同樣的事情嗎?還是我需要成立一名主管的主管來做到這一點? – crockpotveggies 2014-09-23 18:02:57

+1

你不能在阿卡立即阻止演員。正如文檔所說,「演員的實際終止是異步執行的,即在演員停止前可能會返回」停止「。 'Kill'​​和'ActorRef.stop'之間的區別就在於現在已經死了的演員的主管如何處理它。 – Ryan 2014-09-23 18:06:20

+0

啊gotcha,感謝您的幫助! – crockpotveggies 2014-09-23 18:11:56