value actorOf不是对象akka.actor.Actor的成员

时间:2013-12-11 20:33:51

标签: scala akka

我尝试编译这段代码以了解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)
  }
}

2 个答案:

答案 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。