Как завершить работу клиента Scala Remote Actor? - PullRequest
4 голосов
/ 26 сентября 2010

Я играю с удаленными актерами, но сталкиваюсь с некоторыми трудностями.

Рассмотрим этот сервер:

object Server {
    def main(args: Array[String]) {
        val server = new Server
        server.start
    }
}

class Server extends Actor {
    RemoteActor.alive(12345)
    RemoteActor.register('server, this)

    def act() {
        while(true) {
            receive { case x => println(x) }
        }
    }
}

Я написал простой клиент:

object Client {
    def main(args: Array[String]) {
        val server = RemoteActor.select(Node("localhost", 12345), 'server)
        server ! "Hey!"
    }
}

Как и ожидалось, сервер печатает «Привет!».

Однако неожиданно клиентское приложение никогда не завершает работу!

Похоже, что в клиентском приложении было запущено много потоков, но они продолжают работать после завершения моей основной функции!

Что я могу сделать, чтобы закрыть клиентское приложение? И еще: что, если я хочу, чтобы мой клиент мог запускать и останавливать соединения? Как мне этого добиться?

Некоторая дополнительная информация (на основе ответов): я использую scala 2.8.0.final, и здесь я говорю о автономном сервере и автономном клиенте. Они должны быть запущены как $ scala Server и $ scala Client. Я хочу, чтобы приложение «Клиент» завершилось, но этого никогда не произойдет.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 29 сентября 2010

Не отправляйте сообщения другим актерам извне актера.Хотя Scala с радостью примет это, это имеет последствия , такие как вы видите.Вот эквивалентный код, который работает:

import scala.actors.remote._

object Act extends scala.actors.Actor {
  def act = {
        val server = RemoteActor.select(Node("localhost", 12345), 'server)
        server ! "Hey!"
  }
}

object Client {
    def main(args: Array[String]) {
      Act.start()
    }
}

Или, проще говоря,

import scala.actors.Actor.actor
import scala.actors.remote._

object Client {
    def main(args: Array[String]) {
      actor {
        val server = RemoteActor.select(Node("localhost", 12345), 'server)
        server ! "Hey!"
      }        
    }
}
1 голос
/ 29 сентября 2010

В клиентском коде оберните операторы select и связанные с ними в блоке Actor.actor, затем вызовите exit () в конце блока.Не похоже, что вам нужно это делать, но это был единственный найденный мной способ, который завершает все потоки, которые запускает вызов select.

0 голосов
/ 27 сентября 2010

У меня работает следующий код:

import scala.actors.Actor
import scala.actors.remote.RemoteActor
import scala.actors.remote.RemoteActor._
import scala.actors.remote.Node

object Client {
    def main(args: Array[String]) {
        val server = RemoteActor.select(Node("localhost", 12345), 'server)
        server ! "Hey!"
        exit
    }
}
...