17

是否有任何指南或教程可以解释远程使用 scala 演员的可能性?到目前为止,我发现的只是一个例子(没有评论),但这还不够。

4

6 回答 6

10

不久前,我写了一篇带有示例应用程序的文章来解释 Remote Actors 的使用。

好吧,它在代码中没有注释(也许您甚至指的是那篇文章),但是代码下方有解释。

于 2009-03-19T18:27:21.867 回答
3

请注意发送可序列化的消息(案例类和案例对象都是!)并确保对方可以创建类。注意类路径中的自定义类加载器或缺少的 JAR。

于 2009-03-10T12:38:18.897 回答
1

我都不知道。这几乎是一种“穿越丛林”的方法。不过,从 API 来看,事情应该与常规演员的工作方式几乎相同,其中存在一两个教程(以及现在的几本书)。

如果您确实使用了远程演员,我们(社区)当然会欢迎有经验的用户提供这样的教程!

于 2009-02-12T16:45:20.030 回答
1

Akka 框架具有远程参与者。API 与常规的 scala 演员非常相似。

它们也提供了某种程度的自动聚类,但它并不完整。

于 2010-07-21T19:04:14.603 回答
1

最近在 www.scala-lang.org 的首页添加了一个指南,这里是链接 http://www.scala-lang.org/docu/files/actors-api/actors_api_guide.html#

于 2010-12-02T09:58:00.070 回答
1

也许这是一个 necropost,但我一直在寻找,但找不到太多。希望这会对某人有所帮助。

我正在运行Mac OS 10.6.8Scala 2.9.0.1。我在运行规范的远程参与者示例时遇到了问题。我最终得到了以下代码。

注意:清除方法只是为了防止消息堆积。这对示例并不重要。同样,对Thread.sleep的调用只是为了更容易查看运行时发生的情况。

编译它,然后在单独的 shell 实例中执行:

$> scala Ping

$> scala Pong

以任何顺序。您可以通过一次杀死其中一个并跟踪代码来进行实验。

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

/** @author Connor Doyle */

// Remote messages must be serializable.
// The easist way to do this is to wrap
// them with a case class
case class Message(text: String)

abstract class PingPongActor extends Actor with App {
    val pingPort = 9000
    val pongPort = 9001
    val delay = 1000
    classLoader = getClass().getClassLoader() // hack!
    start

    // this method consumes all pending messages
    // the library should have implemented an atomic 
    // receiveAndClear operation
    def clear: Unit = receiveWithin(0) {
        case TIMEOUT => ()
        case _ => clear
    }
}

object Ping extends PingPongActor {

    // result of select already lazy, but explicit lazy conveys
    // semantics clearly
    lazy val pong = select(Node("localhost", pongPort), 'pong)

    def act = {
        alive(pingPort)
        register('ping, self)
        loop {
            pong ! Message("ping")
            receiveWithin(delay * 2) {
                case Message(text: String) => {
                    clear
                    println("received: "+text)
                    Thread.sleep(delay) // wait a while
                }
                case TIMEOUT => println("ping: timed out!")
            }
        }
    }
}

object Pong extends PingPongActor {

    lazy val ping = select(Node("localhost", pingPort), 'ping)

    def act = {
        alive(pongPort)
        register('pong, self)
        loop {
            receiveWithin(delay * 2) {
                case Message(text: String) => {
                    println("received: "+text)
                    Thread.sleep(delay) // wait a while
                    clear
                    ping ! Message("pong")
                }
                case TIMEOUT => println("pong: timed out")
            }
        }
    }
}

干杯!

于 2011-07-20T22:03:47.280 回答