remote.shutdown () не убивает самого удаленного субъекта akka - PullRequest
3 голосов
/ 30 июня 2011
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 , а также сигнал "Стоп", но пульт никогда не завершает свою работу. Я должен убить удаленного субъекта в объекте RemoteEchoServer, вызвав remote.shutdown (). Как отключить удаленного участника, получив сообщение «Стоп»?

Я знаю, что exit (), вероятно, выйдет из серверного приложения напрямую, но что, если все еще есть запрос, необходимо обработать.

Ключевым моментом является вызов remote.shutdown (), который никогда не завершает работу удаленной службы (серверного приложения), поэтому что мне делать, если я хочу остановить серверное приложение для субъекта

1 Ответ

4 голосов
/ 30 июня 2011

Актер может убить себя, вызвав self.stop. Поэтому забудьте PoisonPill и просто используйте сообщение Stop:

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