2015-04-21 32 views
2

我試圖創建一個簡單的應用程序,它有兩個參與者:訂閱多個演員是一紙空文在阿卡

  • 碩士演員,處理一些應用程序的行爲
  • DeadLettersListener是應該處理所有死亡或未處理消息

這裏是一個完美的作品代碼:

object Hw extends App { 
    // creating Master actor 
    val masterActorSystem = ActorSystem("Master") 
    val master = masterActorSystem.actorOf(Props[Master], "Master") 

    // creating Dead Letters listener actor 
    val deadLettersActorSystem = ActorSystem.create("DeadLettersListener") 
    val listener = deadLettersActorSystem.actorOf(Props[DeadLettersListener]) 

    // subscribe listener to Master's DeadLetters 
    masterActorSystem.eventStream.subscribe(listener, classOf[DeadLetter]) 
    masterActorSystem.eventStream.subscribe(listener, classOf[UnhandledMessage]) 
} 

雖然根據akka手冊,ActorSystem是一個沉重的對象,我們應該只爲每個應用程序創建一個。但是,當我替換這些行:此代碼

val deadLettersActorSystem = ActorSystem.create("DeadLettersListener") 
val listener = deadLettersActorSystem.actorOf(Props[DeadLettersListener]) 

val listener = masterActorSystem.actorOf(Props[DeadLettersListener], "DeadLettersListener") 

訂閱不工作了,並DeadLettersListener沒有得到任何死或無法處理的消息。

你能解釋一下我做錯了什麼,並給出一個建議如何在這種情況下訂閱死信?

回答

1

我真的不能想象你在做什麼錯了,我創建了一個小例子,它似乎工作:

object Hw extends App { 

    class Master extends Actor { 
    override def receive: Receive = { 
     case a => println(s"$a received in $self") 
    } 
    } 

    class DeadLettersListener extends Actor { 
    override def receive: Actor.Receive = { 
     case a => println(s"$a received in $self") 
    } 
    } 

    // creating Master actor 
    val masterActorSystem = ActorSystem("Master") 
    val master = masterActorSystem.actorOf(Props[Master], "Master") 
    val listener = masterActorSystem.actorOf(Props[DeadLettersListener]) 

    // subscribe listener to Master's DeadLetters 
    masterActorSystem.eventStream.subscribe(listener, classOf[DeadLetter]) 
    masterActorSystem.eventStream.subscribe(listener, classOf[UnhandledMessage]) 

    masterActorSystem.actorSelection("/unexistingActor") ! "yo" 
} 

你能試試嗎?

+0

非常感謝!你的答案幫助我縮小了範圍,並確定了我有其他代碼最終確實存在的問題 'masterActorSystem.shutdown()' 我認爲這會殺死主演員,但顯然它會殺死所有流演員,包括DeadLettersListener。 –