我之前对弃用的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"
}
}
答案 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"
的情况下才会打印一条消息,在这种情况下,它与第一种情况不匹配,而在第二种情况下则会打印。