2013-12-11 40 views
1

我試圖編譯這段代碼,以瞭解actor如何工作,但它給了我一個錯誤消息:value actorOf不是對象的成員akka.actor.Actorvalue actorOf不是對象的成員akka.actor.Actor

我對akka很陌生,實際上並不瞭解如何開始並瞭解實現整個定義的結構,例如每個類的接收方法。另外,ActorLogging的實際工作是什麼?任何人都可以幫忙嗎?謝謝。

import akka.actor.Actor 

case object Start 

object Main { 
    def main(args: Array[String]): Unit = { 
    println("Start"); 
    val echo = Actor.actorOf[EchoActor] 
    echo.start() 
    echo ! "Hello World" 
    echo.stop() 
    } 
} 
class EchoActor extends Actor { 
    def receive = { 
    case s: String => println(s) 
    } 
} 
+0

你發現了一些非常過時的教程;-)請看看Activator(http://typesafe.com/platform/getstarted)。 –

回答

0

您可能需要首先檢查Akka文檔。這裏是鏈接: http://doc.akka.io/docs/akka/snapshot/scala/actors.html

什麼你想要做的是:

import akka.actor.ActorSystem 

// ActorSystem is a heavy object: create only one per application 
val system = ActorSystem("mySystem") 
val myActor = system.actorOf(Props[MyActor], "myactor2") 

(從了文檔)

所以首先你創建一個演員系統,你應該使用該系統創建演員。

3

看起來像你試圖使用(我認爲)Akka 1.x時代代碼與Akka 2.x.一些語義是完全不同的。這裏要正確實現它的一種方式:

import akka.actor._ 

object Main { 
    def main(args: Array[String]) { 
    println("Start"); 
    val system = ActorSystem("hello-world") 
    val echo = system.actorOf(Props[EchoActor]) 
    echo ! "Hello World" 
    echo ! PoisonPill 
    } 
} 

class EchoActor extends Actor with ActorLogging { 
    override def preStart() { 
    log.info("starting actor") 
    } 
    def receive = { 
    case s: String => log.info(s) 
    } 
    override def postStop() { 
    log.info("stopping actor") 
    context.system.shutdown 
    } 
} 

基本上,你需要使用一個演員系統創建者,不再需要顯式啓動。發送消息的方式相同。要阻止演員,請將其發送給PoisonPill對象,該對象會在演員到達郵箱中的郵件後立即關閉。

此外,我還爲演員添加了一個post-stop掛鉤,以便在actor停止時關閉系統,否則應用程序將永遠不會退出。

ActorLogging特質可讓您輕鬆地將演員連接到Akka的記錄框架。當你將它混合到演員中時,你會得到一個log,你可以像普通的記錄器一樣使用它。

相關問題