문제

스칼라 액터를 원격으로 사용할 가능성을 설명하는 안내서 나 튜토리얼이 있습니까? 지금까지 내가 찾은 것은 한 가지 예 (댓글없이)이지만 충분하지 않습니다.

도움이 되었습니까?

해결책

나는 썼다 원격 액터의 사용을 설명하기위한 예제 앱이있는 기사 얼마 전에 조금.

글쎄, 그것은 코드 내부에 의견이 없지만 (아마도 그 기사를 의미 할 수도 있지만, 코드 아래에 설명이 있습니다.

다른 팁

직렬화 할 수있는 메시지를 보내십시오 (케이스 클래스 및 케이스 객체는!) 반대편이 클래스를 생성 할 수 있는지 확인하십시오. ClassPaths에서 맞춤형 클래스 로더 또는 누락 된 항아리를 조심하십시오.

내가 알고있는 어느 것도. 그것은 "정글을 통한 당신의 길을 해킹"접근 방식입니다. 그러나 API로부터 판단하면 상황은 정규 배우와 거의 동일하게 작동해야합니다. 여기에는 하나 또는 두 개의 튜토리얼 (현재 몇 권의 책)이 있습니다.

원격 배우를 사용한다면, 우리 (커뮤니티)는 숙련 된 사용자의 튜토리얼을 환영합니다!

Akka 프레임 워크가 있습니다 원격 배우. API는 일반 스칼라 배우와 매우 유사합니다.

그들은 어느 정도의 자동 클러스터링을 제공하지만 완전하지는 않습니다.

최근 www.scala-lang.org의 첫 페이지에 가이드가 추가되었습니다. 여기 링크가 있습니다.http://www.scala-lang.org/docu/files/actors-api/actors_api_guide.html#

어쩌면 이것은 네크로 포스트 일지 모르지만 나는 온통 찾고 있었고 많이 찾을 수 없었습니다. 바라건대 이것은 누군가를 도울 것입니다.

나는 달리고있다 Mac OS 10.6.8 그리고 스칼라 2.9.0.1. 표준 원격 배우 예제를 실행하는 데 문제가있었습니다. 나는 다음 코드로 끝났다.

메모: 그만큼 분명한 방법은 메시지가 쌓이는 것을 방지하는 것입니다. 예제에는 중요하지 않습니다. 마찬가지로 전화 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")
            }
        }
    }
}

건배!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top