我尝试编译这段代码以了解actor是如何工作的,但它给了我一条错误信息:value actorOf不是对象的成员akka.actor.Actor
我是akka的新手,实际上无法理解如何启动并了解实现整个定义的结构,例如每个类的receive方法。另外,ActorLogging的实际工作是什么?有人可以帮忙吗?谢谢。
import akka.actor.Actor
case object Start
object Main {
def main(args: Array[String]): Unit = {
println("Start");
val echo = Actor.actorOf[EchoActor]
echo.start()
echo ! "Hello World"
echo.stop()
}
}
class EchoActor extends Actor {
def receive = {
case s: String => println(s)
}
}
答案 0 :(得分:3)
看起来你正在尝试使用(我认为)Akka 1.x时代码与Akka 2.x.一些语义是完全不同的。这是正确实现它的一种方法:
import akka.actor._
object Main {
def main(args: Array[String]) {
println("Start");
val system = ActorSystem("hello-world")
val echo = system.actorOf(Props[EchoActor])
echo ! "Hello World"
echo ! PoisonPill
}
}
class EchoActor extends Actor with ActorLogging {
override def preStart() {
log.info("starting actor")
}
def receive = {
case s: String => log.info(s)
}
override def postStop() {
log.info("stopping actor")
context.system.shutdown
}
}
基本上,您需要使用actor系统来创建actor,这些actor不再需要显式启动。发送消息的方式相同。要停止一个actor,你可以向它发送PoisonPill
对象,这会导致actor一旦到达其邮箱中的消息就立即关闭。
另外,我向actor添加了一个post-stop钩子,当actor停止时关闭系统,否则应用程序永远不会退出。
ActorLogging
特征允许您轻松地将演员连接到Akka的日志框架。当你将它混合到一个演员中时,你得到的log
可以像常规记录器一样使用。
答案 1 :(得分:0)
您可能需要首先查看Akka文档。链接在这里: http://doc.akka.io/docs/akka/snapshot/scala/actors.html
你想做的是:
import akka.actor.ActorSystem
// ActorSystem is a heavy object: create only one per application
val system = ActorSystem("mySystem")
val myActor = system.actorOf(Props[MyActor], "myactor2")
(取自文档)
首先,您要创建一个Actor系统,并且应该使用该系统来创建actor。