Pregunta

¿Hay guías o tutoriales que explican la posibilidad de utilizar actores Scala de forma remota? Todo lo que he encontrado hasta ahora es un ejemplo (sin comentarios), pero eso no es suficiente.

¿Fue útil?

Solución

He escrito un artículo con una aplicación de ejemplo para explicar el el uso de Actores remoto un poco hace algún tiempo.

Bueno, no hay comentarios en el código (tal vez incluso significaba que el artículo), pero hay explicaciones a continuación el código.

Otros consejos

Sólo tenga cuidado al enviar mensajes que son serializables (clases y objetos de casos de casos son!) Y asegúrese de que el lado opuesto puede crear la clase. Cuidado con los cargadores de clases personalizados o frascos desaparecidos en le rutas de clases.

Ninguno de los que soy consciente. Es más o menos un "abrirse paso a través de la selva" enfoque. A juzgar por la API embargo, las cosas deberían funcionar más o menos lo mismo que los actores regulares, para los cuales existen una o dos tutoriales (así como algunos libros ahora).

Si usted hace uso de agentes remotos, nosotros (la comunidad) sin duda la bienvenida a un tutorial de como un usuario con experiencia!

El marco Akka tiene actores remotos . La API es bastante similar a los actores regulares Scala.

Ellos proporcionan un cierto nivel de agrupación automática, así, pero no es completa.

Recientemente hubo una guía añadido en la primera página de www.scala-lang.org, aquí está el enlace http://www.scala-lang.org/docu/ archivos / actores-api / actors_api_guide.html #

Tal vez este es un necropost pero yo estaba buscando por todas partes y no podía encontrar mucho. Espero que esto ayude a alguien.

Me postulo Mac OS 10.6.8 y Scala 2.9.0.1 . Tenía problemas para obtener la distancia actores ejemplo canónico en funcionamiento. Terminé con el siguiente código.

Nota: clara método es sólo para evitar que los mensajes se acumulen. No es crítica para el ejemplo. Asimismo las llamadas a Thread.sleep son sólo para que sea más fácil ver lo que está pasando en tiempo de ejecución.

Compilar, entonces en los casos de concha separadas hacer:

$> scala Ping

y

$> scala Pong

en cualquier orden. Puede experimentar matando a uno de ellos a la vez y el rastreo del código.

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

Saludos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top