2013-12-10 52 views
3

我有一个Actor类来管理Actor的列表。当它收到一个特定类型的消息时,它将它传递给它所知道的每个Actor。超值!不是演员的成员

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得到一个编译错误:“值不是(包).Logger的一员”。 !!这使谷歌非常困难。记录器类编译,有其自己的接收方法,一行包括self ! PoisonPill,这意味着!运营商在那里工作他们在同一个包里。

+0

请显示您的Logger类的代码。 –

+0

它扩展Actor并实现接收。我正在编辑它并删除它的内容,但现在它完全正确。 – CPS

回答

10

我假设Logger extends Actor

在阿卡,消息发送被ActorRef S,不Actor秒之间完成。每个演员的self是一个ActorRef实例。所以你想改变你的记录器变种为var loggers: List[ActorRef]

更好的是,您可以使用ActorSelection,它有一个!方法,该方法将消息发送到选择中的所有actor参考。您可以在演员的context中找到创建ActorSelection的方法。

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

+0

给定一个Actor对象,是否有可能获得ActorRef? – CPS

+0

每个演员都有一个'隐式的最终值自我:ActorRef'([见文档](http://doc.akka.io/api/akka/2.2.3/#akka.actor.Actor)) – Dylan

+2

Dylan显示,你应该*永远不*直接访问一个Actor对象(测试除外)。如果你这样做,你违反了阿卡最基本的原则之一。 http://doc.akka.io/docs/akka/2.2.3/general/addressing.html#addressing。 – Ryan