超值!不是Actor的成员

时间:2013-12-10 14:56:38

标签: scala akka actor

我有一个Actor类来管理Actors列表。当它收到某种类型的消息时,会将其传递给它所知道的每个Actors。

 var loggers : List[Logger]    

def receive = {
  ...
  // log request
  case logmessage : LogMessage => {
      // send message to each logger (if none, nothing happens)
      for (logger <- loggers)
        logger ! logmessage
  }
  ...     
}

我在logger ! logmessage上遇到编译错误:“value!不是(包).Logger”的成员。的!这让谷歌很难。 Logger类编译,有自己的接收方法,一行包括self ! PoisonPill,意思是!运营商在那里工作他们在同一个包裹里。

1 个答案:

答案 0 :(得分:11)

我假设Logger extends Actor

在Akka中,消息发送在ActorRef s之间完成,而不是Actor s。每个演员的self都是ActorRef个实例。因此,您希望将记录器var更改为var loggers: List[ActorRef]

更好的是,你可以使用ActorSelection,它有一个!方法,可以将消息发送给选择中的所有actor refs。您可以在Actor的context中找到创建ActorSelection的方法。

P.S。您可以使用Akka Scaladocs上的"#" page来查找以符号开头的方法。在该页面上,您可以看到!ScalaActorRef上定义了ScalaActorSelection,这两个版本都是来自ActorRefActorSelection的隐式升级。