如何存储scala actor引用?

spy*_*ome 7 scala actor

您好我是Scala的新手,我没有弄清楚如何在第二个演员中存储演员引用,以便稍后发送消息.在我的代码中,我尝试向一个actor发送测试消息.当它收到此消息时,它应该将引用(OutputChannel)存储到第二个actor,稍后应该能够向第二个actor发送消息.我不想使用reply(),因为我只需要在调用响应时才需要发送消息.这是代码.谢谢你的帮助!

import scala.actors.Actor
import scala.actors.Actor._
import scala.collection.mutable.ArrayBuffer 
import scala.actors.OutputChannel

object testactors {

    case object TestMessage
    case object Respond

    class TestActor(name: String) extends Actor {
        private var source : ArrayBuffer[OutputChannel[Any]] = new ArrayBuffer

        def act() {
            loop {
                react{
                    case TestMessage =>
                        println("i received a TestMessage " + name)
                        source += sender
                    case Respond =>
                        println("i received a ResponseMessage " + name)
                }
            }
        }

        def sendMessage(dest: Actor) = dest ! TestMessage

        def respond = {
            println("responding... " + name)
            source(0) ! Respond
        }
    }


    def main(args: Array[String]) {
        val actor1 = new TestActor("one")
        actor1.start

        val actor2 = new TestActor("two")
        actor2.start

        actor1.sendMessage(actor2)

        Thread.sleep(5000)

        actor2.respond
    }
}
Run Code Online (Sandbox Code Playgroud)

Vas*_*iuk 4

1.您可以创建一个集中的参与者注册表。为了避免重新发明轮子,您可以使用一个很好的现有实现 - Akka 的 Actor Registry(或者至少从中获得灵感)。

2您可以避免使用通过反应循环传递的参与者引用的可变列表:

case class AddActor(actor: Actor)
case object NotifyAll

class StatefulActor extends Actor {

  override def act = loop(Nil)

  def loop(actors: List[Actor]):Unit = {
    react {
      case AddActor(actor) => println("Added new actor")
        loop(actor :: actors)
      case NotifyAll => println("Notifying actors: " + actors)
        actors.foreach(_ ! "Hi!")
        loop(actors)
      case unknown => println("Unknown message: " + unknown)    
        loop(actors)
    }
  }

}
Run Code Online (Sandbox Code Playgroud)