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.

War es hilfreich?

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top