我有一个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
,意思是!运营商在那里工作他们在同一个包裹里。
答案 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
,这两个版本都是来自ActorRef
和ActorSelection
的隐式升级。