2014-09-29 38 views
0

我需要知道如何創建一個RoundRobinPool路由器角色,其中每個路由角色都有自己對另一個對象的引用。每個被告人所持有的參考資料必須有所不同。創建一個路由器參與者在akka java中參數化其每條路由的創建

辦法做到這將是這樣的:

ActorRef ref = system.actorOf(new RoundRobinPool(5).props(Props.create(Worker.class, new AnotherObject())), 
"router"); 

,但這種方法的問題在於,每個工人都有相同的參考AnotherObject,我不希望副作用。

這將是這樣的,但有一個路由器演員:

List<Routee> routees = new ArrayList<Routee>(); 
    for (int i = 0; i < 5; i++) { 
     ActorRef r = system.actorOf(Props.create(Worker.class, new AnotherObject())); 
     routees.add(new ActorRefRoutee(r)); 
    } 
    Router router = new Router(new RoundRobinRoutingLogic(), routees); // That is a Router I need an ActorRef 

已經有人知道怎樣做呢?

乾杯

回答

0

可以使用RoundRobinGroup。通過一個組,您可以創建所需的演員,然後在創建組時將演員的路徑傳遞給該組。池和組之間的區別僅僅在於如何創建路由。

編輯實際代碼

String parent = new String("/user/<whatever is your actual path to routees>"); 
List<String> routees = new ArrayList<String>(); 
for (int i = 0; i < 5; i++) { 
    ActorRef r = system.actorOf(Props.create(Worker.class, new AnotherObject()), 「route」 + i); 
    routees.add(parent + 「routee」 + i); 
} 
system.actorOf(new RoundRobinGroup(routees).props(), 「router」); 
+0

我不想將參與者的路徑傳遞給組,因爲我也想動態地創建路由。 給我一個例子你的方式,以更好地理解你的答案。 – cs4r 2014-09-29 18:31:25

+0

您可以創建一個名稱爲routee(例如''routee'+ i')並使用'List '來收集像'routees.add(「routee」+ i)'這樣的名稱。現在將'routees'名單傳遞給組,而不是傳遞ActorRefs。 – 2014-09-29 18:34:52

+0

拉維基蘭用這麼少的代碼你的答案沒有太多有用的... – cs4r 2014-09-29 18:36:43

1

退房有關Router groups的阿卡Java文檔。您可以單獨創建路由,然後通過配置或編程方式將它們提供給路由器組。在你的情況下編程可能是你以後所以你可以傳遞一個不同的參考每個routee。