Подтвердить что ты не робот

Scala удаленные участники

Есть ли какие-либо руководства или учебные пособия, которые объясняют возможность использования scala актеров удаленно? Все, что я нашел до сих пор, является одним из примеров (без комментариев), но этого недостаточно.

4b9b3361

Ответ 2

Просто будьте осторожны, чтобы отправлять сообщения, которые являются сериализуемыми (классы case и case-объекты!), и убедитесь, что противоположная сторона может создать класс. Остерегайтесь пользовательских ClassLoaders или отсутствующих JAR-пакетов в ваших классах.

Ответ 3

Ничто из этого я не знаю. Это в значительной степени "взломать ваш путь через джунгли". Судя по API, все должно работать примерно так же, как и обычные участники, для которых существует один или два учебника (а также несколько книг).

Если вы используете удаленных участников, мы (сообщество) обязательно приветствуем такой урок от опытного пользователя!

Ответ 4

В структуре Akka есть удаленные участники. API довольно похож на обычных участников scala.

Они также обеспечивают некоторый уровень автоматической кластеризации, но не завершены.

Ответ 6

Возможно, это некрополь, но я искал все и не мог найти много. Надеюсь, это поможет кому-то.

Я запускаю Mac OS 10.6.8 и Scala 2.9.0.1. У меня были проблемы с запуском канонических удаленных исполнителей. Я получил следующий код.

Примечание. Метод clear предназначен только для предотвращения наложения сообщений. Это не критично для примера. Аналогично вызовы 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")
            }
        }
    }
}

Ура!