0

我以前对已弃用的 Scala actor 几乎没有经验,最近我开始学习 Akka actor,它们似乎有很大不同。

我完成了本教程http://doc.akka.io/docs/akka/2.2.0/scala/hello-world.html

接下来,我正在尝试编写一个替代的 Hello World,使用类似于已弃用的 Scala actor 的范例。但我有一些困难(见在线评论):

class Echo extends Actor {
  override def receive = {
    case a: Any => println(a)
    case "end" => context.stop(self)
  }
}

object Main {
  def main(args: Array[String]): Unit = {
    val echo = new Echo()

    // Where is explicit Actor.start() ?

    // "! is not a member", but Akka's official Hello World used ! to send message
    echo ! "Hello"
    echo ! "end"
  }
}
4

1 回答 1

0

代码有几处错误。

1) 你不能通过简单地实例化它的类来创建一个actor。您需要使用actorOf 获取ActorRef。为此,您需要启动一个 ActorSystem 来管理 Actor 的创建。

def main(args: Array[String]): Unit = {
  val system = ActorSystem("mySystem")
  val echo = system.actorOf(Props[Echo], "myactor2")
  echo ! "Hello"
  echo ! "end"
}

2)您的接收方法也是错误的。类型的模式Any将匹配所有内容,包括"end". 尝试这样的事情:

   override def receive = {
    case "end" => context.stop(self)
    case a:String => println(a)
  }

此处仅当消息不匹配时才打印消息,"end"在这种情况下,它与第一种情况不匹配并属于第二种情况。

于 2013-08-08T03:32:50.750 回答