Frage
Gibt es Führungen oder Tutorials, die die Möglichkeit erklären fern scala Akteure zu benutzen? Alles, was ich habe nun gefunden, bis ein Beispiel ist (ohne Kommentar), aber das ist kaum genug.
Lösung
Ich habe die erklären Verwendung von Remote-Schauspieler ein wenig vor einiger Zeit.
Nun, es hat keine Kommentare in dem Code (vielleicht haben Sie sogar dazu geführt, dass Artikel), aber es gibt Erklärungen unter dem Code.
Andere Tipps
Nur vorsichtig sein, um Nachrichten zu senden, die serialisierbar sind (Fallklassen und Fall Objekte sind!) Und sicher sein, die gegenüberliegende Seite die Klasse zu schaffen. Achten Sie auf benutzerdefinierte Classloader oder fehlende JAR-Dateien in Ihnen CLASSPATHs.
Keiner von denen ich weiß. Es ist so ziemlich ein „Hack Sie Ihren Weg durch den Dschungel“ -Ansatz. obwohl Geht man von der API, sollten die Dinge funktionieren so ziemlich das gleiche wie normale Schauspieler, für die gibt es ein oder zwei Tutorials (sowie ein paar Bücher jetzt).
Wenn Sie Verwendung von Remote-Akteure machen tun, wir (die Gemeinschaft) würde sicherlich begrüßen eine solche Anleitung von einem erfahrenen Benutzer!
Der Akka Rahmen hat Remote-Akteure . Die API ist ziemlich ähnlich wie regelmäßige scala Akteure.
Sie bieten ein gewisses Maß an automatischen Clustering als gut, aber es ist nicht vollständig.
vor kurzem gab es eine Führung war auf der Titelseite von www.scala-lang.org hinzugefügt, hier ist der Link http://www.scala-lang.org/docu/ Dateien / Schauspieler-api / actors_api_guide.html #
Vielleicht ist dies ein necropost aber ich wurde überall auf der Suche und konnte nicht viel finden. Hoffentlich wird dies jemand helfen.
Ich bin mit Mac OS 10.6.8 und Scala 2.9.0.1 . Ich hatte Probleme das kanonische Fern Akteure Beispiel immer läuft. Ich landete mit dem folgenden Code.
Hinweis: Die klar Methode ist nur Nachrichten zu verhindern, häufen sich. Es ist nicht entscheidend für das Beispiel. Ebenso werden die Anrufe an Thread.sleep sind nur um es leichter zu sehen, was zur Laufzeit vor sich geht.
Kompilieren es dann in getrennten Schalen Fällen tun:
$> scala Ping
und
$> scala Pong
in beliebiger Reihenfolge. Sie können zu einer Zeit, einen von ihnen zu töten experimentieren und den Code zu verfolgen.
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")
}
}
}
}
Cheers!