2009-02-12 116 views
17

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

+0

最近的文档:http://docs.scala-lang.org/overviews/core/actors.html#remote_actors – ekillaby 2013-06-09 20:53:28

回答

10

前段时间我写了an article with an example app to explain the use of Remote Actors

那么,它没有代码内的注释(也许你甚至指的是文章),但下面的代码解释。

+1

还有一个基于我的代码的新例子,但更简单,它手动设置类路径,它可以避免问题:http ://youshottheinvisibleswordsman.co.uk/2009/04/01/remoteactor-in-scala/ – dmeister 2009-04-11 16:55:33

+0

dmeister你的博客发生了什么? – 2009-06-16 07:28:03

1

我没有意识到这一点。这几乎是“穿越丛林”的方式。从API来看,事情应该和普通演员的工作基本相同,因为它有一两个教程(现在还有一些书)。

如果您确实使用了远程参与者,我们(社区)肯定会欢迎有经验的用户提供这样的教程!

3

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

1

Akka框架有remote actors。这个API和普通的scala actor非常相似。

它们提供了一定程度的自动聚类,但它并不完整。

1

也许这是一个necropost,但我一直在寻找全国各地,并不能找到太多。希望这会帮助某人。

我正在运行Mac OS 10.6.8Scala 2.9.0.1。我在运行规范的远程演员示例时遇到了问题。我结束了以下代码。

说明:明确方法只是为了防止消息堆积。这个例子并不重要。同样,调用Thread.sleep只是为了更容易地看到运行时发生了什么。

编译它,然后在单独的壳实例做:

$> 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") 
      } 
     } 
    } 
} 

干杯!