Как мне отключить Scala Remote Actor? - PullRequest
2 голосов
/ 03 декабря 2010

В scala очень легко установить соединение с удаленным актером, но в документации ничего не говорится о разъединении. Простое выбрасывание ссылки не работает, потому что удаленные актеры являются актерами, поэтому они не будут собираться до тех пор, пока не будут остановлены. Так как мне отключиться?

Это не заканчивается после выхода:

import actors.{DaemonActor,remote}
import remote.{RemoteActor,Node}

object SimpleClient{
    val messageHandler = new DaemonActor{
        def act{
            loop{
                react{
                    case message:String =>
                        println("got message: " + message)
                    case _ =>
                }
            }
        }
        start
    }

    def main(args:Array[String]){
        val server = RemoteActor.select(Node("localhost",9999),'server)
        server.send('Connect,messageHandler)

        var exit = false
        while(!exit){
            val message = Console.readLine
            if(message == "exit" || message == "quit") {
                exit = true
                server ! 'Disconnect
            }
            else
                server ! message
        }
    }
}

Это сервер:

import actors.{Actor,OutputChannel}
import actors.remote.RemoteActor

object Server extends Actor{
    val clients = new collection.mutable.HashSet[OutputChannel[Any]]
    def act{
        loop{
            react{
                case 'Connect =>
                    clients += sender
                case 'Disconnect =>
                    clients -= sender
                case message:String =>
                    for(client <- clients)
                        client ! message
            }
        }
    }

    def main(args:Array[String]){
        start
        RemoteActor.alive(9999)
        RemoteActor.register('server,this)
    }
}

Ответы [ 4 ]

3 голосов
/ 03 декабря 2010

[Отказ от ответственности: я ПО Акки]

Могу ли я предложить взглянуть на Акку, которая была создана с учетом Дистанционных Актеров с первого дня?www.akka.io

2 голосов
/ 03 декабря 2010

Черта Reactor определяет protected[actors] def exit(): Nothing, которую актер может вызывать сам при получении сообщения, сообщающего об этом.

sealed trait Msg
case object Apoptosis extends Msg
// ... more messages


class RRActor extends Reactor[Msg] {
  def act =  loop {
    react {
      // ... Whatever messages the actor handles
      case Apoptosis => this.exit
    }
  }
}

Редактировать: Я никогда не проверял это на удаленных актерах.

2 голосов
/ 03 декабря 2010

Ваш вопрос недостаточно ясен в отношении проблемы, с которой, по вашему мнению, вы столкнулись. Актеры не"соединяются" друг с другом (как розетка). Вы отправляете актеру сообщение, потому что у вас есть ссылка на него (или прокси, в случае удаленных актеров).

Наличие такой ссылки не предотвращает выключение актера (любого актера). Если больше нет ссылок на актера и он не запущен, ничто не помешает его сборщику мусора

1 голос
/ 05 декабря 2010

Вот рабочая версия вашего источника с соответствующими изменениями, прокомментированными в строке:

import actors.{DaemonActor,remote}
import remote.{RemoteActor,Node}

case class Send(message: String)
case object Disconnect

object SimpleClient{
    val messageHandler = new DaemonActor{

       def act{
          // keep the reference to the proxy inside the client-side actor
          val server = RemoteActor.select(Node("localhost",9999),'server)
          server ! 'Connect
          loop{
             react{
                case message:String =>
                   println("got message: " + message)
                case Send(message) => server ! message
                case Disconnect => { 
                   // disconnect and exit the client-side actor
                   server ! 'Disconnect //'
                   exit
                }
                case _ =>
              }
          }
      }
      start
   }

   def main(args:Array[String]){
      var exit = false
      while(!exit){
         val message = Console.readLine
         if(message == "exit" || message == "quit") {
            exit = true
            // tell the client-side actor to exit
            messageHandler ! Disconnect
         } else {
            messageHandler ! Send(message)
         }
      }
   }
}
...