Scala remote.shutdown()不会杀死akka远程参与者本身

Scala remote.shutdown()不会杀死akka远程参与者本身,scala,akka,Scala,Akka,客户端发送一个毒药和一个“停止”信号,但遥控器从不自行终止。 我必须通过调用remote.shutdown()杀死对象RemoteEchoServer中的远程参与者。如何通过接收“停止”消息来关闭远程参与者 我知道exit()可能会直接退出服务器应用程序,但如果仍有请求需要处理怎么办 关键点是调用remote.shutdown()永远不要关闭远程服务(服务器应用程序),因此如果我想为参与者停止服务器应用程序,我应该怎么做。因此,忘记服用毒药,只需使用Stop信息: object RemoteEc

客户端发送一个毒药和一个“停止”信号,但遥控器从不自行终止。 我必须通过调用remote.shutdown()杀死对象RemoteEchoServer中的远程参与者。如何通过接收“停止”消息来关闭远程参与者

我知道exit()可能会直接退出服务器应用程序,但如果仍有请求需要处理怎么办


关键点是调用remote.shutdown()永远不要关闭远程服务(服务器应用程序),因此如果我想为参与者停止服务器应用程序,我应该怎么做。因此,忘记服用毒药,只需使用
Stop
信息:

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()
  }
}

我想知道为什么投票决定关闭这个?!为什么你只想关闭一个演员就要关闭整个远程服务?而且你不能在停止消息后发送毒药,因为当你同时发送毒药(将通过远程发送)时,你不能确定远程服务是否仍在工作,我注意到您尚未在客户端上启动远程处理服务。此示例应用程序受示例akka文档的启发,不需要启动客户端,它只是远程Actor的代理。明智的选择是覆盖“def postStop”并关闭远程处理,然后你可以重复使用毒药信息,而不是创建你自己的“停止”信息。我尝试了这种方法,但服务器应用程序在整个程序完成后从未终止,似乎服务器仍在等待接受远程连接。我肯定我是这样用的。我注意到,有时终止可能需要几分钟。你试过等一会儿吗?时间太长了。如果我在RemoteEchoServer中调用remote.shutdown(),服务器应用程序将立即终止。所以多么奇怪的行为。。。。。。。
case "Stop" => {
  println("stopping...")
  self.stop
  remote.shutdown()
}