尝试使用Scala和Akka编写另一个Hello World

时间:2013-08-08 01:38:03

标签: scala akka

我之前对弃用的Scala演员很少有经验,最近我开始学习Akka演员,他们似乎有很大不同。

我完成了本教程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"
  }
}

1 个答案:

答案 0 :(得分:0)

代码有几个问题。

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

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"的情况下才会打印一条消息,在这种情况下,它与第一种情况不匹配,而在第二种情况下则会打印。