2015-04-20 12 views
0

Java/Akka(v2.3.9)在這裏。我的每阿卡UntypedActor子類必須應對一些「通用」消息,如ExecuteOrder66的能力:如何廣播 - 全部在阿卡?

// Groovy pseudo-code 
class StormTrooper extends UntypedActor { 
    @Override 
    void onReceive(Object message) throws Exception { 
     if(message instanceof ExecuteOrder66) { 
      // Betray the Jedi, serve only the emperor. 
     } 
    } 
} 

比方說,我有100個不同的演員子類,每個支持ExecuteOrder66。我需要一種方式將broadcast這個消息的實例給我的每一個演員;所以像大家得到的公開廣播公佈。

我認爲上面的Akka文檔的鏈接讓我接近,但是我沒有看到有人向我的每個演員發送ExecuteOrder66。有任何想法嗎?

回答

4

問題是,不太清楚是誰「大家」是。如果某個演員a從遠程參與者系統獲得來自其他演員b的握手消息,則存儲b的參考,交換幾條消息,然後失敗並重新啓動,但不參考bb是「大家」的一部分嗎?誰負責再次找到演員b?人們甚至應該知道b還活着嗎?

但是,如果您有一個特定的參與者系統,則使用通配符的路徑選擇可以執行您想要的操作。像這樣的東西可能會做的工作:

mySystem.actorSelection("akka://mySystemName/**") 

該角色的選擇可以被用來tell!)的廣播消息系統上每一個演員。您也可以考慮限制一些,並且只選擇/user下的演員,而不要觸摸系統參與者。

聲明:我剛剛在REPL中設置的一個小型特設演員系統並沒有抱怨上述路徑,但我沒有對它進行徹底測試。一個可運行的玩具例子可能會有所幫助。

+0

謝謝@Andrey Tyukin(+1) - 你是說Akka沒有能力「看到」遠程系統的所有演員?我認爲,在連接時(在兩個同伴演員系統之間),將會有信息交換,以便在node1上運行的演員系統#1可以獲得關於演員系統#2的實時統計信息/信息,或許正在運行在'node2'上。你是說這沒有發生?! – smeeb

+0

說實話,我不知道。但我可以很好地想象兩個演員系統'A'和'B'或多或少分開存在的情況,並且自己提供兩種完全不同的服務。有時候,系統'A'可能會向系統'B'發出一些請求。 'B'只會提供請求,否則會保持安靜。現在,如果你有N個不同的系統,它們也可能都是鬆散耦合的,並且或多或少地分開工作。他們爲什麼要一直交換N個實時統計數據? Akka Cluster默認情況下是這樣的,但普通的Actor系統?我不知道。 –

+1

對我以前的評論作出澄清:你說的話(列出其他遠程節點上的角色,交換實時統計數據等)當然是可能的,但這不是默認的。如果有兩個連接的演員系統,我不希望他們總是交換大量的演出統計。同樣,(afaik)沒有向全世界廣播某些東西的功能,但它可以很容易地實現,也許可以在每個演員系統上啓動簡單的MyBroadcaster演員。 –