超值!不是Actor的成员

CPS*_*CPS 4 scala actor akka

我有一个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
  }
  ...     
}
Run Code Online (Sandbox Code Playgroud)

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

Dyl*_*lan 11

我在假设 Logger extends Actor

在Akka中,消息发送是在ActorRefs 之间完成的,而不是Actors.每个演员self都是一个ActorRef实例.所以你想要改变你的记录器var var loggers: List[ActorRef].

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

PS您可以使用Akka Scaladocs上的"#"页面查找以符号开头的方法.在该页面上,您可以看到有一个已!定义的,ScalaActorRef并且ScalaActorSelection两者都是来自ActorRef和的隐式升级ActorSelection.

  • 正如Dylan所示,你应该*从不*直接访问Actor对象(测试除外).如果你这样做,你就违反了Akka最基本的原则之一.http://doc.akka.io/docs/akka/2.2.3/general/addressing.html#addressing. (2认同)