2013-03-30 18 views
3

比方說,我有一個地區演員,每個地區都有一定數量的人在裏面。你如何向每個人廣播一條消息,知道人員名單可以隨時間變化,廣播路由器似乎是選擇,但問題是他們有最大數量的路由,並且我不能動態地追加人路由器。Akka(java),非阻擋廣播給所有的孩子

我的問題是:我知道有一個EventBus,我可以訂閱我的人員到事件總線,但我不希望他們收到發佈的每條消息,我希望他們接收該區域的消息。

現在在阿卡,我們必須創造一個路由器有一定數量routees的, 例如:

Router router = new router(person1, person2) 

這是不好的,因爲在beggining有沒有人在該地區,我不不知道誰將加入我的地區。

有沒有一種方法,使一種動態路由器: 例如:

Region region = new region() 
region.router = new Router() 
Person person1 = new Person() 
region.router.subscribe(person1);  
region.router.tell("hello",null); 

回答

3

您的解決方案已經非常接近:你需要一臺路由器,而不是特製的預製者之一。而不是僅僅寫一個消息轉發給用戶一個演員:

class MyRouter extends UntypedActor { 
    final Set<ActorRef> subscribers = new HashSet<ActorRef>(); 

    @Override public void onReceive(Object msg) { 
    if (msg instanceof Subscribe) { 
     subscribers.add(getSender()); 
    } else if (msg instanceof Unsubscribe) { 
     subscribers.remove(getSender()); 
    } else { 
     for (ActorRef target: subscribers) { 
     target.tell(msg, getSender()); 
     } 
    } 
    } 
} 
+0

哦,我明白了,所以我可以只使用一個非類型化的演員作爲一個路由器。以及非常感謝很多 –

+0

那麼是不是有任何其他方式來處理這個?因爲如果我們向父母發送毒丸,它會殺死其下的所有其他兒童演員。那麼akka使用什麼機制將消息發送給他們的孩子? – sYl3r

+0

只有一種發送消息的機制,對於所有的ActorRefs來說都是一樣的。你可能會考慮不使用PoisonPill併爲你的特定問題創建更有意義的消息類型。 –