2017-01-23 176 views
0

我有一個問題,我的程序的第二次調用給出了不可預知的行爲。遠程Akka演員系統的終止

我正在嘗試確保akka-remoting應用程序的正常關閉。

我有兩個演員系統,一個本地演員系統和一個遠程演員系統。

本地演員系統

  1. 創建兩個演員,一個在本地系統上,一個在遠程
  2. 關閉自己下來

我第一次啓動遠程演員系統,然後運行本地演員系統。

當我第一次運行它時,一切正常,並且本地actor系統關閉(遠程仍然運行)。但是如果我第二次運行這個(不重新啓動遠程系統),行爲是不同的,兩個角色系統開始跳動。 本地不關閉。

最小代碼複製行爲是低於

本地演員系統

object ActorAsSink_7 extends App { 
    val system = ActorSystem("system") 
    val localActor = system.actorOf(MyActor_4.props) 
    val remoteActor = system.actorOf(MyActor_4.props, "remote_agent") 
    localActor ! PoisonPill 
} 

遠程演員系統

object RemoteActorSystem extends App { 

    import system.dispatcher 
    implicit val system = ActorSystem("remote-actorsystem") 

    // actors in this actor system are created remotely 

    println("hello.. remote agent is up") 

} 

這是一個更大的代碼部分基地,這是最低限度,我能找到repl這個問題。

爲什麼我的本地角色系統的行爲不同並且在第二次調用時沒有關閉?

本地演員做以下

object MyActor_4 { 
    val props = Props[MyActor_4] 
} 

class MyActor_4 extends Actor with ActorLogging { 
    def receive = { case x: Any => log.error("unexpected message in reaper: " + x) } 
    override def postStop = { println ("shutting down...") ; context.system.terminate(); } 
} 

遠程處理工作正常,但對於這個問題,關機。

回答

0

根據我的理解,下面的代碼行不會停止remoteActor。

localActor ! PoisonPill 

因爲PoisonPill會停止發件人actor及其所有子actor。 此處remoteActor不是localActor的子actor。 你可以分享本地演員系統的兩位演員在第一次運行時停止的日誌嗎?

+0

要關閉ActorSystem,你可以這樣做'system.shutdown' 停止localActor&remoteActor而不停止ActorSystem'system.actorSelection(「/ user/*」)! PoisonPill' 可以查看詳情 http://stackoverflow.com/questions/9356986/stop-all-actors-in-a-system-without-shutting-down-the-system-itself – Advika