2012-08-30 20 views
8

我開始通過將現有的Java SE應用程序遷移到Akka來學習Akka。我正在使用Akka 2.0.3。向Java中的Actor發送PoisonPill

有一次我需要通過消息隊列發送一個PoisonPill來停止演員。我的演員因此實例:

ActorRef myActor = actorSystem.actorOf(new Props(MyActor.class), "myActor"); 

,而我嘗試發送PoisonPill:

myActor.tell(PoisonPill.getInstance()); 

,但我得到以下編譯器錯誤:

'tell(java.lang.Object)' in 'akka.actor.ActorRef' cannot be applied to '(akka.actor.PoisonPill$)' 

我在做什麼錯?我在Idea中運行Java 1.6.0_26(在Eclipse中我也在學習一輩子)。


編輯:

我也嘗試過這種方法,這是在文檔中,但我得到相同的編譯器錯誤和Idea警告我說,演員類已過時。

import static akka.actor.Actors.*; 
extractionActor.tell(poisonPill()); 
+7

問題標題爲+1。我不知道它是怎麼回事,但它有點像一部驚悚片或恐怖片的場景:-) – Ridcully

+0

這是真的 - 我從來沒有這樣讀過!相信我,我其實是現實生活中一個非常好的人。 – Rich

回答

6

請閱讀阿卡文檔,我們已經花了很多時間創建它:

PoisonPill

You can also send an actor the akka.actor.PoisonPill message, which will stop the actor when the message is processed. PoisonPill is enqueued as ordinary messages and will be handled after messages that were already queued in the mailbox.

Use it like this:

import static akka.actor.Actors.*; 
    myActor.tell(poisonPill()); 

上述方法一直以來2.0.2棄用,這是新的API:

ActorRef ref = system.actorOf(new Props(JavaAPITestActor.class)); 
ref.tell(PoisonPill.getInstance()); 

以上在我的機器上編譯,所以你可能在IDEA中有一些問題?試着用javac編譯它,看看是否可行。

+0

對不起,我應該說,我確實已經閱讀過文檔,並且在提出這個問題之前確實嘗試過,但是不僅我得到相同的編譯錯誤,我還被告知Actors已被棄用,這就是爲什麼我嘗試了其他做法。我會更新我的答案。 – Rich

+0

非常好,謝謝,我已經編輯了我的答案,以反映已棄用的API和新的API。 –

+0

我已經回到Eclipse了,它編譯得很好!我想這可能是Idea中的一個錯誤,但它可能更像是我在IDE中做錯事的情況,我不知道那麼好...... – Rich

4

正如我在回覆上面的評論時所說的,這在Idea中或在使用gradle編譯時不起作用。它實際上是一個編譯錯誤,因爲發送者ActorRef是必需的。我知道以前的答案是老了,我不知道這是否是在API的變化,因此對於具有類似問題的人,你應該使用:

target.tell(PoisonPill.getInstance(), ActorRef.noSender()); 

更多信息參見:http://doc.akka.io/docs/akka/snapshot/java/lambda-actors.html#PoisonPill