是否有任何指南或教程可以解释远程使用scala演员的可能性?我到目前为止所发现的只是一个例子(没有评论),但这还不够。
答案 0 :(得分:10)
我前段时间写了an article with an example app to explain the use of Remote Actors。
嗯,它在代码中没有注释(也许你甚至意味着那篇文章),但代码下面有解释。
答案 1 :(得分:3)
小心发送可序列化的消息(case类和case对象!)并确保对方可以创建类。 在类路径中注意自定义ClassLoader或缺少JAR。
答案 2 :(得分:1)
我都不知道。这几乎是“穿越丛林的方式”。从API来看,事情应该和常规演员几乎一样,有一两个教程(现在还有一些书)。
如果你确实使用了远程演员,我们(社区)肯定会欢迎有经验的用户提供这样的教程!
答案 3 :(得分:1)
Akka框架有remote actors。 API与常规的scala actor非常相似。
它们也提供某种程度的自动聚类,但它并不完整。
答案 4 :(得分:1)
最近在www.scala-lang.org的首页上添加了一个指南,这里是链接 http://www.scala-lang.org/docu/files/actors-api/actors_api_guide.html#
答案 5 :(得分:1)
也许这是一个necropost,但我一直在寻找并找不到多少。希望这会对某人有所帮助。
我正在运行 Mac OS 10.6.8 和 Scala 2.9.0.1 。我在运行规范的远程演员示例时遇到了问题。我最终得到了以下代码。
注意: clear 方法只是为了防止邮件堆积。这个例子并不重要。同样,对 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")
}
}
}
}
干杯!