2011-06-30 47 views
3
object RemoteEchoServer extends App { 
    remote.start("localhost", 1111) 
    remote.register("hello-service", actorOf[HelloWorldActor]) 
} 

object RemoteEchoClient extends App { 
    val actor = remote.actorFor("hello-service", "localhost", 1111) 
    val reply = actor !! "Hello" 
    println(reply) 
    actor ! "Stop" 
    actor ! PoisonPill 
} 

/** 
* a remote actor servers for message "Hello" and response with a message "World" 
* it is silly 
*/ 
class HelloWorldActor extends Actor { 
    def receive = { 
    case "Hello" => 
     println("receiving a Hello message,and a World message will rply") 
     self.reply("World") 
    case "Stop" => 
     println("stopping...") 
     remote.shutdown() 
    } 
} 

客戶端發送一個PoisonPill以及一個「停止」信號,但遠程從來沒有自行終止。 我必須通過調用remote.shutdown()來殺死對象RemoteEchoServer中的遠程actor。如何通過收到「停止」消息來關閉遠程角色?remote.shutdown()不殺的阿卡遠程演員本身

我知道exit()可能會直接退出服務器應用程序,但如果仍有請求需要處理,該怎麼辦?

關鍵的一點是調用remote.shutdown()永遠不會關閉遠程服務(服務器應用程序),所以我應該怎麼做,如果我想停止服務器應用程序的演員

+0

我想知道爲什麼這被投票關閉? – fresskoma

+1

爲什麼要關閉整個遠程服務只關閉一個演員? –

+1

而且你不能發送PoisonPill_after_停止消息,因爲當你發送PoisonPill(它將由遠程發送)時,你不能確定遠程處理仍在工作 –

回答

4

一個參與者可以通過殺死自己調用self.stop。所以忘記PoisonPill,只是使用Stop消息:

case "Stop" => { 
    println("stopping...") 
    self.stop 
    remote.shutdown() 
} 
+4

明智的替代方法是重寫「def postStop」並關閉遠程處理,然後您可以重複使用PoisonPill消息,而不是創建自己的「停止」消息。 –

+0

是的。這樣更好。 – paradigmatic

+0

我試過這種方式,但服務器應用程序在整個程序完成後從未終止,似乎服務器仍在等待接受遠程連接 – jilen