2013-05-20 52 views
0

已經隨後的文檔的例子(2.1.4),我是有一個微內核加載演員處理消息,其中,所述可引導擴展類定義爲麻煩如下:實例化在微內核AKKA

class HelloKernel extends Bootable { 
    val system = ActorSystem("hellokernel") 
    def startup = { 
    system.actorOf(Props[HelloActor]) ! Start 
    } 
    def shutdown = { 
    system.shutdown() 
    } 
} 

如果虛設(即未在代碼中的其他任何地方使用)實例被創建,如下所示,然後按預期處理消息。

class HelloKernel extends Bootable { 
    val system = ActorSystem("hellokernel") 

    val dummyActor = system.actorOf(Props[HelloActor]) 

    def startup = { 
    system.actorOf(Props[HelloActor]) ! Start 
    } 
    def shutdown = { 
    system.shutdown() 
    } 
} 

如果有確實是一個虛擬實例,或者通過這樣做,我會造成一些副作用,導致郵件被處理?

根據Thomas Letschert在Akka 2.1 minimal remote actor example中給出的代碼,我已將服務器端轉變爲Microkernel託管的演員。

import akka.actor.Actor 
import akka.actor.ActorLogging 
import akka.actor.ActorSystem 
import akka.actor.Props 
import akka.kernel.Bootable 


class Joe extends Actor { 
    def receive = { 
    case msg: String => println("joe received " + msg + " from " + sender) 
    case _ => println("Received unknown msg ") 
    } 
} 

class GreetServerKernel extends Bootable { 
    val system = ActorSystem("GreetingSystem") 
    val joe = system.actorOf(Props[Joe], name = "joe") 
    println(joe.path) 
    joe ! "local msg!" 
    println("Server ready") 

    def startup = { 
    } 

    def shutdown = { 
    println("PrimeWorker: Shutting Down") 
    system.shutdown 
    } 

} 

在這種情況下,虛擬實例,當其刪除的消息不處理,是

val joe = system.actorOf(Props[Joe], name = "joe") 

調用者的代碼是

import akka.actor._ 
import akka.actor.ActorDSL._ 

object GreetSender extends App { 
    implicit val system = ActorSystem("GreetingSystem") 
    val joe = system.actorFor("akka://[email protected]:2554/user/joe") 

    println(joe.path) 

    val a = actor(new Act { 
    whenStarting { joe ! "Hello Joe from remote" } 
    }) 

    joe ! "Hello" 

    println("Client has sent Hello to joe") 
} 
+0

我不喜歡認爲你應該需要虛擬實例。第一個例子有哪些類型的問題? – cmbaxter

+0

雖然在第一個示例中存在成功的連接,但在雙方中的一個隨後停止時顯示錯誤消息,則不會處理任何消息。只要虛擬實例化完成,代碼或配置文件不再有任何更改,即可處理接收中的案例。 –

+0

如果它與microkernal示例不同,您可以發佈您的'HelloActor'代碼嗎? – cmbaxter

回答

1

如果您發佈的代碼確實是準確的,那麼只需將joe實例的實例移動到startup操作中,而不是在可引導類的構造函數中:

def startup = { 
    system.actorOf(Props[Joe], name = "joe") 
} 

與名字joe綁在一起的演員需要先啓動,然後纔能有人按名稱查找並向其發送消息。它與啓動類的構造函數啓動基本相同,但我相信該約定規定要在startup函數中執行所有actor實例化,而不是可引導類體(以及因此的構造函數)

+0

完美。它按照你的描述工作。謝謝你的時間。 –