如何终止Scala Remote Actor客户端?

时间:2010-09-25 22:44:52

标签: scala actor remote-actors

我正在和远程演员一起玩,但我遇到了一些困难。

考虑这个服务器:

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!"
    }
}

正如所料,服务器打印“嘿!”。

然而,出乎意料的是,客户端应用程序永远不会终止!

看起来很多线程已经在客户端应用程序上启动了,但是在我的main函数完成后它们继续运行!

如何终止客户端应用程序?还有更多:如果我希望我的客户能够启动和停止连接怎么办?我怎样才能做到这一点?

一些额外的信息(基于回复):我正在使用scala 2.8.0.final,我在这里谈论的是一个独立的服务器和一个独立的客户端。它们应该像$ scala Server$ scala Client一样启动。我想要发生的是应用程序“客户端”应该完成,但它永远不会发生。

谢谢!

3 个答案:

答案 0 :(得分:3)

不要从演员外部向其他演员发送消息。虽然Scala很乐意接受它,但正如你所看到的那样has consequences。这是一个有效的代码:

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 :(得分:1)

在客户端代码中,将select和相关语句包装在Actor.actor块中,然后在块的末尾调用exit()。看起来你不应该这样做,但这是我发现终止select调用开始的所有线程的唯一方法。

答案 2 :(得分:0)

以下代码适用于我:

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