2009-02-12 32 views
17

Có hướng dẫn hoặc hướng dẫn nào giải thích khả năng sử dụng diễn viên scala từ xa không? Tất cả tôi đã tìm thấy cho đến bây giờ là một ví dụ (không có ý kiến) nhưng đó là hầu như không đủ.Scala diễn viên từ xa

+0

Tài liệu gần đây: http://docs.scala-lang.org/overviews/core/actors.html#remote_actors – ekillaby

Trả lời

10

Tôi đã viết an article with an example app to explain the use of Remote Actors một chút thời gian trước đây.

Vâng, nó không có ý kiến ​​bên trong mã (có thể bạn thậm chí có nghĩa là bài viết đó), nhưng có những giải thích bên dưới mã.

+1

Có một ví dụ mới khác dựa trên mã của tôi nhưng đơn giản hơn và đặt classpath theo cách thủ công tránh các sự cố: http : //youshottheinvisibleswordsman.co.uk/2009/04/01/remoteactor-in-scala/ – dmeister

+0

dmeister điều gì đã xảy ra với bạn blog? –

+0

Dường như liên kết của bạn bị hỏng.Bạn có thể khắc phục điều đó, cũng như diễn giải những gì bạn đang liên kết để thông tin vẫn hợp lệ trong trường hợp liên kết lại chết không? –

1

Không ai trong số đó tôi biết. Đó là khá nhiều cách "hack theo cách của bạn thông qua rừng". Đánh giá từ API mặc dù, mọi thứ sẽ hoạt động khá giống với các diễn viên thông thường, trong đó có tồn tại một hoặc hai hướng dẫn (cũng như một vài cuốn sách bây giờ).

Nếu bạn sử dụng các diễn viên từ xa, chúng tôi (cộng đồng) chắc chắn sẽ chào đón một hướng dẫn như vậy từ một người dùng có kinh nghiệm!

3

Chỉ cần cẩn thận để gửi các tin nhắn có thể tuần tự hóa (trường hợp các lớp và đối tượng trường hợp!) Và chắc chắn rằng phía đối diện có thể tạo lớp. Xem ra cho các Trình nạp lớp tùy chỉnh hoặc các JAR bị thiếu trong các đường dẫn lớp của bạn.

1

Khung Akka có remote actors. API khá giống với các diễn viên scala thông thường.

Chúng cũng cung cấp một số mức tự động phân cụm, nhưng không hoàn chỉnh.

1

lẽ đây là một necropost nhưng tôi đang tìm kiếm khắp nơi và không thể tìm thấy nhiều . Hy vọng rằng điều này sẽ giúp một ai đó.

Tôi đang chạy Mac OS 10.6.8Scala 2.9.0.1. Tôi đã gặp sự cố khi tải ví dụ về diễn viên từ xa chuẩn. Tôi đã kết thúc với mã sau đây.

Lưu ý: Phương thức xóa chỉ nhằm ngăn thư được xếp chồng. Nó không quan trọng đối với ví dụ. Tương tự như vậy, các cuộc gọi tới Thread.sleep chỉ giúp bạn dễ dàng xem những gì đang diễn ra khi chạy.

Biên dịch nó, sau đó trong trường hợp vỏ riêng biệt làm:

$> scala Ping 

$> scala Pong 

trong bất kỳ thứ tự. Bạn có thể thử nghiệm bằng cách giết một trong số chúng tại một thời điểm và truy tìm mã.

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

Chúc mừng!

+0

Nhìn lại, sau khi đã sử dụng diễn viên để xây dựng một hệ thống, một hoạt động "nhận nguyên tử và rõ ràng" trong hầu hết các trường hợp là một ý tưởng khủng khiếp. –

Các vấn đề liên quan