2013-12-10 48 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